1. 程式人生 > 程式設計 >對接支付寶沙箱環境

對接支付寶沙箱環境

本文主要講解了對接支付寶沙箱環境,生成支付二維碼的流程,本人水平有限,如有不當之處,望指出,感謝

一、進入支付寶開發平臺

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中有其他介面的對接,可以自行嘗試,都類似