沙箱環境 (Beta) 是協助開發者進行接口功能開發及主要功能聯調的輔助環境,模擬了開放平臺部分產品的主要功能和主要邏輯。可用于在產品上線前了解環境、組合和調試各種接口。
沙箱環境配置
打開 支付寶開發者中心 并登錄,點擊 => 進入我的控制臺(也可能登錄之后自動進入),

在開發者中心中點擊開發服務下的研發服務,就進入沙箱環境頁面了,

在沙箱應用可以看到基本配置。

密鑰配置
點擊 RSA2(SHA256)密鑰 設置,

點擊 支付寶密鑰生成器,下載對應版本的工具,下載完成后將工具安裝在不包含空格的目錄中,

然后點打開,點擊生成密鑰,即可生成商戶應用私鑰與商戶應用公鑰。然后點擊復制公鑰。

回到沙箱界面,選擇公鑰,并把剛剛復制的公鑰粘貼進去;

然后就可以得到支付寶公鑰了,代碼中會用到。

node API 配置
首先安裝 Alipay SDK:
npm install alipay-sdk -S
// sdk 配置語法
alipaySdk.exec(method, params, options);
- method:字符串類型,調用的 Api,比如 alipay.trade.page.pay ;
- params:可選參數,對象結構,Api 的請求參數;
- options:包含
- validateSign:布爾值,是否對返回值驗簽,需要依賴支付寶公鑰;
- formData:對象結構,文件上傳類接口的請求參數;
- log:對象結構,存在時會調用 info、error 方法寫日志。
由于每次調用 AlipaySdk 的 API 都是同一個對象,所以該對象只需要實例化一次:
// alipay.js 這里單獨存放一個文件中,需要時引入即可
const AlipaySdk = require('alipay-sdk').default; // 引入 SDK
const alipaySdk = new AlipaySdk({
AppId: 'appId', // 開放平臺上創建應用時生成的 appId
signType: 'RSA2', // 簽名算法,默認 RSA2
gateway: 'https://openapi.alipaydev.com/gateway.do', // 支付寶網關地址 ,沙箱環境下使用時需要修改
alipayPublicKey: 'public_key', // 支付寶公鑰,需要對結果驗簽時候必填
privateKey: 'private_key', // 應用私鑰字符串
});module.exports = alipaySdk;
要完成支付,需要以下幾個步驟,
- 服務器端需要調用支付 API alipay.trade.page.pay 來獲取支付頁面的地址;
- 將得到的支付地址發給客戶端,由客戶端進行頁面跳轉;
先來看看服務端接口的實現:
var express = require('express');
var router = express.Router();const alipaySdk = require('../utils/alipay');
const AlipayFormData = require('alipay-sdk/lib/form').default; // alipay.trade.page.pay 返回的內容為 Form 表單
router.post('/pcpay', (req, res) => {
(async () => { // 調用 setMethod 并傳入 get,會返回可以跳轉到支付頁面的 url
const formData = new AlipayFormData();
formData.setMethod('get');
// 通過 addField 增加參數
// 在用戶支付完成之后,支付寶服務器會根據傳入的 notify_url,以 POST 請求的形式將支付結果作為參數通知到商戶系統。
formData.addField('notifyUrl', 'http://www.com/notify'); // 支付成功回調地址,必須為可以直接訪問的地址,不能帶參數
formData.addField('bizContent', {
outTradeNo: req.body.outTradeNo, // 商戶訂單號,64個字符以內、可包含字母、數字、下劃線,且不能重復
productCode: 'FAST_INSTANT_TRADE_PAY', // 銷售產品碼,與支付寶簽約的產品碼名稱,僅支持FAST_INSTANT_TRADE_PAY
totalAmount: '0.01', // 訂單總金額,單位為元,精確到小數點后兩位
subject: '商品', // 訂單標題
body: '商品詳情', // 訂單描述
}); // 如果需要支付后跳轉到商戶界面,可以增加屬性"returnUrl"
const result = await alipaySdk.exec(
'alipay.trade.page.pay', // 統一收單下單并支付頁面接口
{}, // api 請求的參數(包含“公共請求參數”和“業務參數”)
{ formData: formData }, ); // result 為可以跳轉到支付鏈接的 url
res.json({ url: result }); })();});
然后就是前端頁面,這個比較簡單,就是點擊支付按鈕,向服務器發起請求,拿到返回的支付頁面地址后進行跳轉:
$.ajax({
method: 'POST',
url: '/alipay/pcpay',
data: { outTradeNo // 商戶訂單號,必須保證唯一,生成方法有很多,可以去看我的代碼 }}).done(function(res) {
window.open(res.url, '_blank');
}).fail(function(err) {
console.log(err);
});
如果上訴沒有問題,我們應該能看到這樣的頁面:

如果是使用沙箱環境,必須下載沙箱錢包來完成支付,下載地方如下所示:

下載完成后,使用沙箱提供的賬號登陸即可,隨便充值,隨便消費,其實沙箱錢包里就是一個數字而已。

然后這里補充一個點,就是前端如何判斷用戶是否已經支付。我們都知道前端的手段是不被信任的,所以不能依賴前端來判斷,唯一可靠的方法是使用支付寶 API 中的 alipay.trade.query 來查詢是否已經完成支付。
可以通過前端發送訂單號到服務器進行查詢,服務器向支付寶服務器查詢該訂單號支付的相關信息,通過交易狀態來確定是否已經完成支付,具體服務器配置如下:
const axIOS = require('axios');
const alipaySdk = require('../utils/alipay');
const AlipayFormData = require('alipay-sdk/lib/form').default;
router.get('/query', function(req, res) {
(async function() {
const { outTradeNo } = req.query; const formData = new AlipayFormData(); formData.setMethod('get');
formData.addField('bizContent', {
outTradeNo }); // 通過該接口主動查詢訂單狀態 const result = await alipaySdk.exec( 'alipay.trade.query',
{}, { formData: formData }, ); axios({ method: 'GET',
url: result }) .then(data => {
let r = data.data.alipay_trade_query_response; if(r.code === '10000') { // 接口調用成功
switch(r.trade_status) { case 'WAIT_BUYER_PAY':
res.send('交易創建,等待買家付款');
break;
case 'TRADE_CLOSED':
res.send('未付款交易超時關閉,或支付完成后全額退款');
break;
case 'TRADE_SUCCESS':
res.send('交易支付成功');
break;
case 'TRADE_FINISHED':
res.send('交易結束,不可退款');
break;
} } else if(r.code === '40004') {
res.send('交易不存在');
} }) .catch(err => { res.json({ msg: '查詢失敗',
err }); }); })();});
【本文轉載自我的微信公眾號-飛舟技術社區】
【喜歡我的文章歡迎 轉發 點贊 與 關注,我會經常與大家分享前端的知識點的】