對接支付寶沙箱環境
本文主要講解了對接支付寶沙箱環境,生成支付二維碼的流程,本人水平有限,如有不當之處,望指出,感謝
一、進入支付寶開發平臺
1、搜尋支付寶開發
2、登入
3、進入到沙箱環境
沙箱環境主要資訊
可以點進去看看,瞭解大致都有什麼東西,一會要用
沙箱工具中有沙箱版支付寶軟體,可下載至自己手機,賬號和密碼均在沙箱賬號中
設定好公鑰
主要設定應用公鑰
如果不會,可以點選支付寶說明,有詳細步驟
4、下載demo
點選開發者中心概覽
右側SDK下載
支付寶提供了很多測試Demo,拿來改改就可以直接用
找到當面付
下載
二、獲取支付二維碼
1、開啟測試Demo
2、修改配置檔案
工程中有一個zfbinfo.properties配置檔案,是對接中的一些重要配置資訊
這裡只撿出來必要的欄位
#網管修改為dev
open_api_domain=https://openapi.alipaydev.com/gateway.do
#沙箱賬號中,商戶的UID,這個為收錢商戶的ID
pid = 2088102178032752
#沙箱應用中,appid
appid = 2016100100635726
# RSA私鑰、公鑰和支付寶公鑰
private_key = 支付寶公私鑰軟體生成的公鑰
public_key = 支付寶公私鑰軟體生成的私鑰的pkcs8版
#其他欄位根據個人需求修改複製程式碼
3、Main類
main方法中使用了main.test_trade_precreate();
我們可以修改main.test_trade_precreate();
方法中的內容,來自定義資訊
1)435行的路徑可以設定為本機路徑,為圖片生成路徑
String filePath = String.format("C:/Users/bai/Desktop/qr-%s.png",response.getOutTradeNo());
//這行程式碼的註釋開啟,用來生成圖片到我們的路徑下
ZxingUtils.getQRCodeImge(response.getQrCode(),256,filePath);複製程式碼
2)423行為回撥介面的URL,在使用者掃碼後和支付成功後,支付寶分別會有一次回撥,兩個回撥呼叫這一個介面,可以根據狀態列位做判斷,在JSON報文中有欄位解釋
.setNotifyUrl("外網可訪問的支付寶回撥URL")複製程式碼
3)其他資訊可以根據註釋和個人需求定製
修改資訊後直接執行main即可在指定路徑下生成二維碼圖片
4、四個JSON報文
獲取二維碼發出的JSON:
//獲取二維碼發出的json
{
//必填,訂單號,64個字元以內,字母數字下劃線
"out_trade_no": "tradeprecreate15647279763334241735","seller_id": "",//收款支付寶ID,如為空,按支付寶開發應用配置中的pid使用
"total_amount": "100",//必填,總金額(打折前)
"undiscountable_amount": "0",//不打折金額(實際付款金額),選填,預設為總金額-打折金額
"subject": "xxx品牌xxx門店當面付掃碼消費",//必填,訂單標題
"body": "購買商品3件共20.00元",//訂單描述
//商品資訊
"goods_detail": [{
"goods_id": "goods_id001","goods_name": "xxx小麵包","quantity": 1,"price": "10"
},{
"goods_id": "goods_id002",//商品ID
"goods_name": "xxx牙刷",//商品名
"quantity": 2,//數量
"price": "5" //單價
}],"operator_id": "test_operator_id",//商戶操作員編號,可以用來做銷售統計,選填
"store_id": "test_store_id",//必填,商戶門店編號
//自定義引數,回撥時會帶回,目前只支援sys_service_provider_id
"extend_params": {
"sys_service_provider_id": "2088100200300400500"
},//過期時間
"timeout_express": "120m"
}複製程式碼
獲取二維碼響應的JSON:
//支付寶響應響應
{
"alipay_trade_precreate_response": {
"code": "10000",//其他錯誤的狀態碼可以去支付寶官網檢視
"msg": "Success","out_trade_no": "tradeprecreate15647279763334241735",//圖片
"qr_code": "https:\/\/qr.alipay.com\/bax03381xcn7dw89lcih007e"
},"sign": "hFNh5JIlUR9rY42ModDoCj/7CA/05cHUq5fI/XaWGRpVAxR3i8tGjTa7XQpvNZEpGd04D/vI5KF/9QfDV7nH5MGNAR/JQA2fkHrevvbfiBV1O+aKzBIZel4BRTNDTrTH1k+DxWE7nn2Ei54DDwnuk47l8bKhMM4jA6fFCcu/oimcybvMdQV/HyHqssiIph/0OiorFMrOebIKPieAGF7+XksIa1OrSSRCCsjYxh2c7vIHFLCDU1rlSpL8e8USl0bkMy5XX+qCn967aQVet+ejy4eMSYZ2PFNGY3HlgAESX2PEhfDd8opmED3xWSzSzLJUW2RRisjwkR0Pjz8AXe0fGA=="
}
複製程式碼
使用者掃碼回撥JSON:
//掃碼後
{
"gmt_create": ["2019-08-02 14:39:53"],//訂單建立時間
"charset": ["utf-8"],"seller_email": ["[email protected]"],//售貨員郵箱,沙箱賬戶中資訊
"notify_time": ["2019-08-02 14:39:54"],//通知時間
"subject": ["xxx品牌xxx門店當面付掃碼消費"],//標題
//簽名
"sign": ["OiXtXYPpQx2siDhBJiKYyEpYYd1NULnt1pKAP+MGJHaya8bIFzHcx3GdQLMmj3MPL+jKimMd2+lMVNCfvxjXvYLLfyHe3TrxECI1vGuS3ROREz0xwl6vQemZnBVgphGGulAVYsmzVyBq3L0mfGwPgFgAVnU63iK874l1C57hlsGZTetkyEKcBWPgOchNKciHDTLgzuaEQnhn37JYJbAm1SZB5hGc4HxHsKWEvdmfu+dzU7uE0WdBTs76V1xG8lyMeKjcUjah4NAsxbp0HRvli5lWiCEXt30eIJZJAEcgraL/lrpmb0p7AabLixbsT+P/ibF4pEWByXX7lzkYa/+aGA=="],"body": ["購買商品3件共20.00元"],//訂單詳情
"buyer_id": ["2088102178090170"],//買主ID
"version": ["1.0"],//版本
"notify_id": ["2019080200222143954090171000498739"],//通知ID
"notify_type": ["trade_status_sync"],//通知型別
"out_trade_no": ["tradeprecreate15647279763334241735"],//訂單號
"total_amount": ["100.00"],//總價格
"trade_status": ["WAIT_BUYER_PAY"],//交易狀態
"trade_no": ["2019080222001490171000065035"],//交易編號
"auth_app_id": ["2016100100635726"],//app ID
"buyer_logon_id": ["kdl***@sandbox.com"],//買主登入ID
"app_id": ["2016100100635726"],//app—ID
"sign_type": ["RSA2"],//簽名型別
"seller_id": ["2088102178032752"] //商戶UID,支付寶開發中資訊
}複製程式碼
使用者付款回撥JSON:
//支付成功後
{
"gmt_create": ["2019-08-02 14:39:53"],"charset": ["utf-8"],"subject": ["xxx品牌xxx門店當面付掃碼消費"],"sign": ["UBHEmHSVGHz3e/sPYx0wEe7n2jRKVBFiraQdfwp49ElD3XqWemOtk6xFpj1wlVzElOCov9V/RWJr+Xhw98A9yxybtWboFBOCg3oyUXdftLDhUD3gFkUVoGyB70LvPeIG5qzo84/zcrr/F/JqTuiFXzuG7CYpzg1g/H6K2Be7X+cT+9xsvT4llkZB2mso0pkWTXFoR0kG8OrjuYdaBo0yKIFWIn6JYGxsyrX1jn/hj/v6VthKIf17u/bSVxZUcZO/asgjqd2v1wweELJsyvSz7pwW0R+bqKRvZ+wLGsV9r3LQC6TQecQIP4adFlfdVAWPJ981einnk+F2+0u38K3WCg=="],"buyer_id": ["2088102178090170"],"notify_id": ["2019080200222144027090171000500200"],"total_amount": ["100.00"],"app_id": ["2016100100635726"],"sign_type": ["RSA2"],"buyer_logon_id": ["kdl***@sandbox.com"],"seller_id": ["2088102178032752"],"version": ["1.0"],"out_trade_no": ["tradeprecreate15647279763334241735"],"trade_no": ["2019080222001490171000065035"],"auth_app_id": ["2016100100635726"],//---------------以上是掃碼後同有的資料
"notify_time": ["2019-08-02 14:40:27"],//通知時間
"gmt_payment": ["2019-08-02 14:40:26"],//支付時間
"trade_status": ["TRADE_SUCCESS"],//支付狀態,成功
"buyer_pay_amount": ["100.00"],//買方花費金額
"invoice_amount": ["100.00"],//發票金額
"fund_bill_list": ["[{\"amount\":\"100.00\",\"fundChannel\":\"ALIPAYACCOUNT\"}]"],"receipt_amount": ["100.00"],"point_amount": ["0.00"] //優惠價格
}複製程式碼
5、回撥介面
回撥的介面必須是外網可訪問,可以使用花生殼做內網穿透
搭建一個外網可訪問的服務,我這裡使用的SpringBoot快速搭建,也可以直接使用Web專案放到Tomcat中執行
@RestControllerpublic
class WebController {
@PostMapping("/")
public String receive(ZfbRequestBean zfbRequestBean) {
System.out.println(zfbRequestBean);
return "hello";
}
}複製程式碼
用ZfbRequestBean來接收請求過來的資料,所有的屬性都和上面的JSON報文對應
@Data註解是Lombok,很方便的一個IDEA外掛,可以自動生成getter,setter,toString方法,這裡不做過多解釋,如果沒有使用,可以自行新增getter,setter方法
@Data
public class ZfbRequestBean {
private String gmt_create;
private String charset;
private String seller_email;
private String subject;
private String sign;
private String body;
private String buyer_id;
private BigDecimal invoice_amount;
private String notify_id;
private String fund_bill_list;
private String notify_type;
private String trade_status;
private BigDecimal receipt_amount;
private BigDecimal buyer_pay_amount;
private String app_id;
private String sign_type;
private String seller_id;
private String gmt_payment;
private String notify_time;
private String version;
private String out_trade_no;
private BigDecimal total_amount;
private String trade_no;
private String auth_app_id;
private String buyer_logon_id;
private BigDecimal point_amount;
}複製程式碼
當使用者掃碼和支付後,此介面會被支付寶呼叫
fund_bill_list欄位比較特殊,是個字串JSON,這裡沒有做轉換,可以自行轉換
三、補充
1、web版Demo
該測試工程下有webapp目錄,可以自行配置Tomcat,執行index.html,有做好的頁面版對接
需要改動幾處
把zfbinfo.properties配置檔案拷貝道WEB-INF資料夾中
trade_precreate.jsp檔案第31行修改為Configs.init("../zfbinfo.properties");
如果需要測試其他介面,路徑都需要修改
這裡是個人的解決方案,如有更好,可以在評論區討論
2、其他介面
Main方法和WebAPP中有其他介面的對接,可以自行嘗試,都類似