Javascript 谷歌支付在网络上的实现

Javascript 谷歌支付在网络上的实现,javascript,php,ruby-on-rails,payment-gateway,google-pay,Javascript,Php,Ruby On Rails,Payment Gateway,Google Pay,我想在我的网站上添加google pay buy now按钮,我使用了以下文档作为参考。 一切正常,下面是我创建的代码 <div id="buy-now"></div> <script async src="https://pay.google.com/gp/p/js/pay.js" onload="onGooglePayLoaded()"> </script> <sc

我想在我的网站上添加google pay buy now按钮,我使用了以下文档作为参考。 一切正常,下面是我创建的代码

<div id="buy-now"></div>

<script async
  src="https://pay.google.com/gp/p/js/pay.js"
  onload="onGooglePayLoaded()">
</script>


<script>
let googlePayClient;

const baseCardPaymentMethod = {
    type: 'CARD',
    parameters: {
        allowedCardNetworks: ['VISA','MASTERCARD'],
        allowedAuthMethods: ['PAN_ONLY','CRYPTOGRAM_3DS']
    }
};

const googlePayBaseConfiguration = {
    apiVersion: 2,
    apiVersionMinor: 0,
    allowedPaymentMethods: [baseCardPaymentMethod]
};

function onGooglePayLoaded() {

    googlePayClient = new google.payments.api.PaymentsClient({
        environment: 'TEST'
    });

    // check compatability
    googlePayClient.isReadyToPay(googlePayBaseConfiguration)
    .then(function(response) {
        if(response.result) {
            createAndAddButton();
        } else {
            alert("Unable to pay using Google Pay");
        }
    }).catch(function(err) {
        console.error("Error determining readiness to use Google Pay: ", err);
    });
}

function createAndAddButton() {

    const googlePayButton = googlePayClient.createButton({

        // currently defaults to black if default or omitted
        buttonColor: 'default',

        // defaults to long if omitted
        buttonType: 'long',

        onClick: onGooglePaymentsButtonClicked
    });

    document.getElementById('buy-now').appendChild(googlePayButton);
}

function onGooglePaymentsButtonClicked() {
    // TODO: Perform transaction
    const tokenizationSpecification = {
        type: 'PAYMENT_GATEWAY',
        parameters: {
            gateway: 'example',
            gatewayMerchantId: 'gatewayMerchantId'
        }
    };

    const cardPaymentMethod = {
        type: 'CARD',
        tokenizationSpecification: tokenizationSpecification,
        parameters: {
            allowedCardNetworks: ['VISA','MASTERCARD'],
            allowedAuthMethods: ['PAN_ONLY','CRYPTOGRAM_3DS'],
            billingAddressRequired: true,
            billingAddressParameters: {
            format: 'FULL',
            phoneNumberRequired: true
            }
        }
    };

    const transactionInfo = {
        totalPriceStatus: 'FINAL',
        totalPrice: '123.45',
        currencyCode: 'USD'
    };

    const merchantInfo = {
        merchantId: 'BCR2DN6TRPZNDYLL', Only in PRODUCTION
        merchantName: 'Example Merchant Name'
    };

    const paymentDataRequest = Object.assign({}, googlePayBaseConfiguration, {
        allowedPaymentMethods: [cardPaymentMethod],
        transactionInfo: transactionInfo,
        merchantInfo: merchantInfo   
    });

    googlePayClient
    .loadPaymentData(paymentDataRequest)
    .then(function(paymentData) {
        processPayment(paymentData);
    }).catch(function(err) {
        // Log error: { statusCode: CANCELED || DEVELOPER_ERROR }
    });
    
}


function processPayment(paymentData) {
    // TODO: Send a POST request to your processor with the payload
    // https://us-central1-devrel-payments.cloudfunctions.net/google-pay-server 
    // Sorry, this is out-of-scope for this codelab.
    return new Promise(function(resolve, reject) {
        // @todo pass payment token to your gateway to process payment
        const paymentToken = paymentData.paymentMethodData.tokenizationData.token;
        console.log('mock send token ' + paymentToken + ' to payment processor');
        setTimeout(function() {
            console.log('mock response from processor');
            alert('done');
            console.log(paymentData);
            resolve({});
        }, 800);
    });
}
</script>

让谷歌支付客户;
const baseCardPaymentMethod={
键入:“卡”,
参数:{
允许的信用卡网络:[“VISA”、“万事达卡”],
allowedAuthMethods:['PAN_ONLY','CRYPTOGRAM_3DS']
}
};
const googlePayBaseConfiguration={
版本:2,,
apiVersionMinor:0,
allowedPaymentMethods:[baseCardPaymentMethod]
};
函数onGooglePayLoaded(){
googlePayClient=新建google.payments.api.PaymentsClient({
环境:“测试”
});
//检查兼容性
googlePayClient.isReadyToPay(googlePayBaseConfiguration)
.然后(功能(响应){
if(response.result){
createAndAddButton();
}否则{
警报(“无法使用谷歌支付支付”);
}
}).catch(函数(err){
console.error(“确定是否准备好使用谷歌支付时出错:”,err);
});
}
函数createAndAddButton(){
const googlePayButton=googlePayClient.createButton({
//如果默认或省略,则当前默认为黑色
按钮颜色:“默认值”,
//如果省略,则默认为long
按钮类型:“长”,
onClick:ongooglepaymentsbuttonclick
});
document.getElementById('buy-now').appendChild(googlePayButton);
}
函数onGooglePaymentsButtonClicked(){
//TODO:执行事务
常量标记化规范={
类型:“支付网关”,
参数:{
网关:“示例”,
gatewayMerchantId:“gatewayMerchantId”
}
};
const cardPaymentMethod={
键入:“卡”,
标记化规范:标记化规范,
参数:{
允许的信用卡网络:[“VISA”、“万事达卡”],
allowedAuthMethods:['PAN_ONLY','CRYPTOGRAM_3DS'],
billingAddressRequired:true,
billingAddressParameters:{
格式:'完整',
所需电话号码:true
}
}
};
常量事务处理信息={
totalPriceStatus:“最终”,
总价:'123.45',
货币代码:“美元”
};
const merchantInfo={
商品名称:“BCR2DN6TRPZNDYLL”,仅在生产中
merchantName:“示例商户名称”
};
const paymentDataRequest=Object.assign({},googlePayBaseConfiguration{
allowedPaymentMethods:[cardPaymentMethod],
transactionInfo:transactionInfo,
商品信息:商品信息
});
谷歌支付客户端
.loadPaymentData(paymentDataRequest)
.然后(函数(paymentData){
处理支付(paymentData);
}).catch(函数(err){
//日志错误:{statusCode:cancelled | | DEVELOPER_error}
});
}
函数processPayment(paymentData){
//TODO:使用有效负载向处理器发送POST请求
// https://us-central1-devrel-payments.cloudfunctions.net/google-pay-server 
//抱歉,这超出了此代码实验室的范围。
返回新承诺(功能(解决、拒绝){
//@todo将支付令牌传递到您的网关以处理支付
const paymentToken=paymentData.paymentMethodData.tokenizationData.token;
log('mock send token'+paymentToken+'to paymentprocessor');
setTimeout(函数(){
log(“来自处理器的模拟响应”);
警报(“完成”);
控制台日志(paymentData);
解析({});
}, 800);
});
}
我熟悉PHP和Ruby,我不想使用第三方支付网关进行标记化规范,我想使用直接方法。我不知道下一步该做什么,也不知道如何在支付成功后比较令牌,也不知道令牌化规范与直接方法的关系。请帮助我。
谢谢大家。

如果你正在做一个Web集成,考虑使用。有一个if-use-React和一个用于大多数其他框架的版本

至于直接整合,由于额外的合规义务,强烈反对直接整合。发件人:

关键点:直接集成允许商家在其服务器上解密谷歌支付响应。要获得资格,您必须符合支付卡行业(PCI)数据安全标准(DSS)1级标准。您的服务器还需要具备所需的基础设施,以安全地处理用户的支付凭据

代表实际商户提供网关或处理服务的第三方没有资格使用直接集成。有关您作为支付服务提供商集成的问题

如果您不满足必要的先决条件,我们建议您使用接收支付令牌

出于兴趣,你为什么不想使用支付网关

如果您仍然觉得需要直接集成,可以在以下位置找到有关如何解密令牌的资源:

我不知道下一步该做什么,也不知道如何在支付成功后比较令牌,也不知道令牌化规范与直接方法的关系。请帮助我

您需要在谷歌支付控制台上注册公钥。您还需要更新
tokenizationSpecification
以包含公钥(下面的示例)

支付成功后如何比较代币

谷歌支付不会处理付款,你会。您需要解密支付令牌,获取支付详细信息,并自行处理支付

直接集成是一个比较困难的集成过程,所以我强烈鼓励首先探索其他的选择,如果你不能使用支付网关,只考虑这一点。

"tokenizationSpecification": {
  "type": "DIRECT",
  "parameters": {
    "protocolVersion": "ECv2",
    "publicKey": "BOdoXP1aiNp.....kh3JUhiSZKHYF2Y="
  }
}