最近在接入各種支付機構(gòu),鑒于各種產(chǎn)品業(yè)務(wù)需求不同,具體開發(fā)實現(xiàn)不盡相同,不討論具體業(yè)務(wù)實現(xiàn)。
前一篇銀聯(lián)支付開發(fā)介紹了幾種銀聯(lián)支付交互方法和實例報文。本文主要回顧一下支付寶常用支付方式的開發(fā)和交互報文,還有在開發(fā)時遇到的一些坑。
支付寶支付產(chǎn)品大全,主要介紹:
一、手機網(wǎng)站支付
手機網(wǎng)站支付主要應(yīng)用于手機、掌上電腦等無線設(shè)備的網(wǎng)頁上,通過網(wǎng)頁跳轉(zhuǎn)或瀏覽器自帶的支付寶快捷支付實現(xiàn)買家付款的功能,資金即時到賬。
根據(jù)請求參數(shù),后臺將相關(guān)參數(shù)值填好,組裝成HTML報文之后返回給客戶端即可,比較重要的幾個參數(shù)
參數(shù) | 參數(shù)名稱 | 參數(shù)說明 | 樣例 |
---|---|---|---|
service | 接口名稱 | 接口名稱 | alipay.wap.create.direct.pay.by.user |
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<form id="alipaysubmit" name="alipaysubmit" action="https://mapi.alipay.com/gateway.do?_input_charset=utf-8" method="get">
<input type="hidden" name="service" value="alipay.wap.create.direct.pay.by.user" />
<input type="hidden" name="partner" value="合作商戶ID,需要跟支付寶申請" />
<input type="hidden" name="_input_charset" value="utf-8" />
<input type="hidden" name="sign_type" value="MD5" />
<input type="hidden" name="sign" value="78ff1f0d498b6bc1302b9fcb96e25edf" />
<input type="hidden" name="notify_url" value="http://127.0.0.1:8080/pay-front/aliPayResultNotify" />
<input type="hidden" name="return_url" value="http://127.0.0.1:8080/Service/toReturn.action" />
<input type="hidden" name="out_trade_no" value="00652016012716580911842412986916" />
<input type="hidden" name="subject" value="1" />
<input type="hidden" name="total_fee" value="0.01" />
<input type="hidden" name="seller_id" value="合作商戶ID,需要跟支付寶申請" />
<input type="hidden" name="payment_type" value="1" />
<input type="hidden" name="body" value="20160127|10201601271658060548484552912431|ALIPAY-WAP|1" />
<input type="hidden" name="exter_invoke_ip" value="112.97.57.54" />
</form>
<script>document.forms['alipaysubmit'].submit();</script>
</body>
</html>
表單提交后跳到支付寶頁面:
支付成功后支付寶會根據(jù)請求參數(shù)的notify_url返回到商戶后臺,然后完成剩余邏輯即可。
二、及時到賬
及時到賬其實就是手機到賬的PC網(wǎng)頁版,不知道為什么支付寶沒有把這2個整合到一起。及時到賬的開發(fā)跟手機網(wǎng)站支付區(qū)別不大,請求參數(shù)的service有區(qū)別:
參數(shù) | 參數(shù)名稱 | 參數(shù)說明 | 樣例 |
---|---|---|---|
service | 接口名稱 | 接口名稱 | create_direct_pay_by_user |
組裝成HTML提交即可。
三、移動支付
移動支付是一種程序式的支付方式,在手機、掌上電腦等無線設(shè)備的應(yīng)用程序內(nèi),買家可通過支付寶進行付款購買特定服務(wù)或商品,資金即時到賬。
移動支付說白了就是你的移動設(shè)備安裝了支付寶app,付款時在客戶端上調(diào)起支付寶的支付控件,完成支付過程。
參數(shù) | 參數(shù)名稱 | 參數(shù)說明 | 樣例 |
---|---|---|---|
service | 接口名稱 | 接口名稱 | mobile.securitypay.pay |
四、說明(遇到的坑)
關(guān)于簽名:
支付寶支持的簽名方式較多,MD5、RSA都支持,其中移動支付目前僅支持RSA簽名方式,其他方式都支持MD5/RSA,需要說明的是,MD5簽名的時候是將key按字母順序排序,然后拼上從支付寶申請的MD5 key,組成一個新的字符串,然后簽名,如:
key-value如下:
_input_charset=utf-8&body=20160128|10201601281559200554074030492283|ALIPAY-WAP|1&exter_invoke_ip=112.97.61.254¬ify_url=http://127.0.0.1:8080/&out_trade_no=00652016012815592280050374808082&service=alipay.wap.create.direct.pay.by.user&subject=1&total_fee=0.01
假設(shè)你從支付寶申請的MD5 KEY為:aabbccddeeff
拼接上去后是:
_input_charset=utf-8&body=20160128|10201601281559200554074030492283|ALIPAY-WAP|1&exter_invoke_ip=112.97.61.254¬ify_url=http://127.0.0.1:8080/&out_trade_no=00652016012815592280050374808082&service=alipay.wap.create.direct.pay.by.user&subject=1&total_fee=0.01aabbccddeeff
之前做微信支付的時候定勢思維,以為兩者的拼接方式相同,下意識的也這么做,結(jié)果一直驗簽不過,微信的拼接方式是,在原來字符串的基礎(chǔ)上加上"&key=MD5 KEY",如:
_input_charset=utf-8&body=20160128|10201601281559200554074030492283|ALIPAY-WAP|1&exter_invoke_ip=112.97.61.254¬ify_url=http://127.0.0.1:8080/&out_trade_no=00652016012815592280050374808082&service=alipay.wap.create.direct.pay.by.user&subject=1&total_fee=0.01&key=aabbccddeeff
然后再計算MD5。
值得注意的是,計算MD5簽名難道不大,但是跟支付寶調(diào)試的時候容易出現(xiàn)驗簽不過,比較多的都是簽名串與提交表單的input不同、字符編碼不同……為了解決編碼不同導(dǎo)致的驗簽不過,我們通常在表單頭中加入:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
移動支付中,需要對簽名值進行一次URL編碼,但是,在支付結(jié)果通知的報文的簽名值卻不需要對簽名值進行URL解密,比較奇怪的地方。
try {
/**
* 僅需對sign 做URL編碼
*/
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}