Я в процессе интеграции AmazonPay в React SPA. Классическая интеграция опирается на теги сценариев и обратные вызовы ( docs ).
Вот один пример из виджета кнопки:
<head>
<script type='text/javascript'>
window.onAmazonLoginReady = function() {
amazon.Login.setClientId('CLIENT-ID');
};
window.onAmazonPaymentsReady = function() {
showButton();
};
</script>
<script async="async" src='https://static-na.payments-amazon.com/OffAmazonPayments/us/sandbox/js/Widgets.js'>
</script>
</head>
<body>
. . .
<div id="AmazonPayButton">
</div>
...
<script type="text/javascript">
function showButton(){
var authRequest;
OffAmazonPayments.Button("AmazonPayButton", "SELLER-ID", {
type: "TYPE",
color: "COLOR",
size: "SIZE",
authorization: function() {
loginOptions = {scope: "SCOPES",
popup: "POPUP-PARAMETER"};
authRequest = amazon.Login.authorize (loginOptions,
"REDIRECT-URL");
},
onError: function(error) {
// your error handling code.
// alert("The following error occurred: "
// + error.getErrorCode()
// + ' - ' + error.getErrorMessage());
}
});
};
</script>
. . .
<script type="text/javascript">
document.getElementById('Logout').onclick = function() {
amazon.Login.logout();
};
</script>
</body>
При использовании React div
с id="AmazonPayButton"
не отображается на странице, пока React не смонтирует div
, что приведет к сбою функции window.showButton()
.
Чтобы обойти эту проблему, я обернул определение function showButton()
внутри window.showButton()
:
window.onAmazonPaymentsReady = function() {
window.showButton = function () {
var authRequest;
// eslint-disable-next-line no-undef
OffAmazonPayments.Button("AmazonPayButton", "%REACT_APP_AMAZON_SELLER_ID_SANDBOX%", {
type: "PwA",
color: "Gold",
size: "medium",
authorization: function () {
loginOptions = {
scope: "profile postal_code payments:widget payments:shipping_address",
popup: true
};
authRequest = amazon.Login.authorize(loginOptions, "%PUBLIC_URL%/pay-with-amazon");
},
onError: function (error) {
console.log(error.toString())
}
});
};
};
Компонент, содержащий AmazonPay div
, теперь можно вызывать по componentDidMount
:
import React, {Component} from 'react'
class AmazonMethod extends Component {
componentDidMount () {
window.showButton()
}
render() { return <div id="AmazonPayButton"></div>}
}
export default AmazonMethod
Я запутался, как получить доступ к обратному вызову onError
из моего компонента React. Как мне прослушать обратный звонок и ответить соответствующим образом?
Этот вопрос также относится к AddressWidget и WalletWidget; все они полагаются на обратные вызовы тега сценария.
Обновление :
Я написал сообщение , в котором кратко описывается, как интегрировать AmazonPay с React на стороне клиента.