# 直连接口下单并支付接入

# 一、渠道:PSE、Efecty(旧)

新:PSE、Efecty 支付成功后通过pay_url跳转到payty付款(2023年3月27日启用)。

旧:PSE、Efecty 支付成功后需跳转到payty付款(已对接旧版,不支持新版),详细流程如下:

# 1、支付返回样例(成功):

新
{
    "code":"10000",
    "msg":"Success",
    "out_trade_no":"out_trade_no_1285925731034600",
    "trade_no":"LP20230310035011408-YNdRcq",
    "trade_status":"PROCESSING",
    "pay_url":"https://secure.payty.com/t/8x8pk8gk"
}
旧:不支持
{
    "code":"10000",
    "msg":"Success",
    "trade_no":"2022021402120600004",
    "out_trade_no":"LP20220214021316563-5d0Wg6",
    "web_url":"",
    "pay_url":"https://secure.payty.com/vads-payment/",
    "trade_status":"PROCESSING",
    "form_date":{
        "vads_payment_cards":"VISA;PSE",
        "signature":"V64LLsvVZR+7UoKGxEKu0alqTvAVmh81+5vASLLECl0=",
        "vads_trans_date":"20220214021206",
        "vads_ctx_mode":"TEST",
        "vads_action_mode":"INTERACTIVE",
        "vads_page_action":"PAYMENT",
        "vads_order_description":"luxpag test",
        "vads_order_id":"2022021402120600004",
        "vads_currency":"170",
        "vads_version":"V2",
        "vads_trans_id":"07hscj",
        "vads_amount":100000,
        "vads_payment_config":"SINGLE",
        "vads_site_id":"10454805"
    }
}

# 2、支付成功跳转(不支持):

旧:不支持
<input type="button" id="button1" onclick="pay()" value="Test" />

<script type="text/javascript">
    function pay() {
        var pay_url = "https://secure.payty.com/vads-payment/";
        var form_date = {
            "vads_payment_cards": "VISA;PSE",
            "signature": "V64LLsvVZR+7UoKGxEKu0alqTvAVmh81+5vASLLECl0=",
            "vads_trans_date": "20220214021206",
            "vads_ctx_mode": "TEST",
            "vads_action_mode": "INTERACTIVE",
            "vads_page_action": "PAYMENT",
            "vads_order_description": "luxpag test",
            "vads_order_id": "2022021402120600004",
            "vads_currency": "170",
            "vads_version": "V2",
            "vads_trans_id": "07hscj",
            "vads_amount": 100000,
            "vads_payment_config": "SINGLE",
            "vads_site_id": "10454805"
        }
        
        location.href = pay_url + "?" + Object.keys(form_date)?.map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(form_date[k])}`).join("&");
    }
</script>  

# 二、渠道:Wallet - Paypal

Wallet Paypal 下单前需向luxpag获取token,然后向Paypal获取nonce,详细流程如下:

# 1、获取 Luxpag Wallet Paypal Token:

# 请求接口ROOT地址

  测试环境 : https://gateway-sandbox.luxpag.com
  正式环境 : https://gateway.luxpag.com

# 接口

  /trade/get-paypal-client-token

# Request Header

参数名 必须 描述
Content-Type 推荐 application/json
Authorization yes Basic Base64(app_id:secret_key)

# 请求参数(JSON格式)

参数名 类型 必须 最大长度/默认值 描述
app_id string yes 32 商户后台创建并获得
timestamp string yes 19 yyyy-MM-dd HH:mm:ss
region string no 区域编码,当 app 为 Global 时,该字段必须

# 请求样例

curl --location --request POST 'https://gateway.luxpag.com/trade/get-paypal-client-token' \
--header 'Authorization: Basic Base64(appid:secret_key)' \
--header 'Content-Type: application/json' \
--data-raw '{
    "app_id": "app_id",
    "timestamp": "{{datetime}}",
}'

# 响应(JSON格式)

参数名 类型 描述
code string 返回码
msg string 返回消息
token string token

# 返回样例(成功)

{
    "code": "10000",
    "msg": "Success",
    "token": "{token}",
}

# 2、获取 Paypal nonce:

var myDeviceData;
// token:Luxpag token
function payForward(token) {
    braintree.client.create({
        authorization:  token // Token you got from Luxpag server
    }).then(function (clientInstance) {
        return braintree.dataCollector.create({
            client: clientInstance,
        });
    }).then(function (dataCollectorInstance) {
        // At this point, you should access the dataCollectorInstance.deviceData value and provide it
        // to your server, e.g. by injecting it into your form as a hidden input
        myDeviceData = dataCollectorInstance.deviceData;
        // Initialize your PayPal Checkout component here
        return braintree.paypalCheckout.create(/* ... */);
    });
    // Create a client.
    braintree.client.create({
        authorization: token//Token you got from Luxpag server
    }).then(function (clientInstance) {
        // Create a PayPal Checkout component.
        return braintree.paypalCheckout.create({
            client: clientInstance
        });
    }).then(function (paypalCheckoutInstance) {
        return paypalCheckoutInstance.loadPayPalSDK({
            vault: true
        });
    }).then(function (paypalCheckoutInstance) {
        return paypal.Buttons({
            fundingSource: paypal.FUNDING.PAYPAL,
            createBillingAgreement: function () {
                return paypalCheckoutInstance.createPayment({
                    flow: 'vault', // Required
                });
            },
            style: {
                shape: "rect",
                height: 52,
            },
            onApprove: function (data, actions) {
                return paypalCheckoutInstance.tokenizePayment(data).then(function (payload) {
                    // Submit `payload.nonce` to your server
                    // Submit Luxpag pay Interface and token = payload.nonce
                });
            },
            onCancel: function (data) {
                console.log('PayPal payment canceled', JSON.stringify(data, 0, 2));
            },
            onError: function (err) {
                console.error('PayPal error', err);
            }
        }).render('#paypal-button');
    }).then(function () {
        // The PayPal button will be rendered in an html element with the ID
        // `paypal-button`. This function will be called when the PayPal button
        // is set up and ready to be used
    }).catch(function (err) {
        // Handle component creation error
    });
}

# 3、直连下单并支付

调用直连支付接口下单并支付。

# 4、申请Luxpag钱包测试账号。

测试用户账号。

# 5、样例。

仅供参考。建议把 Luxpag 接口请求写在服务端,获取 Paypal nonce 写在客户端。

<script src="https://res.luxpag.com/lib/js/jquery-1.10.2.min.js"></script>
<script src="https://js.braintreegateway.com/web/3.85.2/js/client.min.js"></script>
<script src="https://js.braintreegateway.com/web/3.85.2/js/paypal-checkout.min.js"></script>
<script src="https://js.braintreegateway.com/web/3.79.0/js/data-collector.min.js"></script>

<div id="paypal-button"> </div>

<script type="text/javascript">
    $(document).ready(function () {
    var param= '{"app_id":"???????","timestamp":"2022-01-20 14:55:10"}';
    $.ajax({
        type: "POST",
        url: "https://gateway-sandbox.luxpag.com/trade/get-paypal-client-token",
        headers: {'Authorization': 'Basic ???????'},
        cache: false,
        dataType: "json",
        contentType: "application/json",
        data: param,
        success: function (d) {
            if (d.code == "10000" && d.token != null) {
                payForward(d.token);
            }
        }
    });
});

var myDeviceData;
// token:Luxpag token
function payForward(token) {
    braintree.client.create({
        authorization:  token
    }).then(function (clientInstance) {
        return braintree.dataCollector.create({
            client: clientInstance,
        });
    }).then(function (dataCollectorInstance) {
        myDeviceData = dataCollectorInstance.deviceData;
        return braintree.paypalCheckout.create(/* ... */);
    });
    braintree.client.create({
        authorization: token
    }).then(function (clientInstance) {
        return braintree.paypalCheckout.create({
            client: clientInstance
        });
    }).then(function (paypalCheckoutInstance) {
        return paypalCheckoutInstance.loadPayPalSDK({
            vault: true
        });
    }).then(function (paypalCheckoutInstance) {
        return paypal.Buttons({
            fundingSource: paypal.FUNDING.PAYPAL,
            createBillingAgreement: function () {
                return paypalCheckoutInstance.createPayment({
                    flow: 'vault', // Required
                });
            },
            style: {
                shape: "rect",
                height: 52,
            },
            onApprove: function (data, actions) {
                return paypalCheckoutInstance.tokenizePayment(data).then(function (payload) {
                    // Submit `payload.nonce` to your server
                    // Submit Luxpag pay Interface and token = payload.nonce
                    pay(payload.nonce);
                });
            },
            onCancel: function (data) {
            },
            onError: function (err) {
            }
        }).render('#paypal-button');
    }).then(function () {
    }).catch(function (err) {
    });
}
function pay(token){
    var param = {};
    param.token = token;

    $.ajax({
        type: "POST",
        url: "https://gateway-sandbox.luxpag.com/trade/pay",
        headers: {'Authorization': 'Basic ???????'},
        cache: false,
        dataType: "json",
        contentType: "application/json",
        data: JSON.stringify(param),
        success: function (d) {
        }
    });
}
</script>