在app開發過程中,關於支付寶模塊apiPayPlus你有沒有遇到過這樣的問題:微信支付可以輕鬆通過,支付寶支付會出現閃退的問題(錯誤代碼:ALI40247)。
或許,你絞盡腦汁想出瞭解決方案,但從來沒寫過開發心得,不能供其他開發小夥們學習參考。也或許,你身心正在被這個問題折磨着。今天,柚子君給大家轉載一位優秀開發者的成功經驗,希望能幫助到大家。
關於支付寶模塊apiPayPlus的使用成功經驗分享
1、支付寶這邊必須簽約成功,這是必須的。
在開發者中心查看自己的應用,是否已經成功上線。
2、查看這裏的app支付是否已經生效
這裏是很重要的一步。因爲開發者用的是aliPayPlus的第二種支付方式,不知道是用RSA2還是RAS1,所以兩處都設置成一樣。這個地方需要下載支付寶提供的密鑰生成工具來生成。
密鑰格式選擇pkcs8,密鑰長度爲1024或者2048,這個不影響。
然後把商戶應用公鑰填寫到支付寶官網開發者中心的接口加簽方式裏面,這樣支付寶服務器端就配置完成。
3、接下來就是做app客戶端的相關配置
1、根據教程,配置config.xml和key.xml 這兩個配置在官方文檔已經明細說明,不再過多細述。
2、支付代碼:
var aliPayPlus = api.require('aliPayPlus');
aliPayPlus.config({
appId : '',
rsaPriKey : '',
}, function(ret, err) {
if (ret.status == true) {
aliPayPlus.pay({
subject : '貨物運輸款',
body : '貨物運輸款',
amount : alimoney,
tradeNO : paytradeNo
}, function(ret, err) {
if (ret.code == 9000) {
api.toast({
msg : '支付成功'
});
paylog(1);
} else {
if (ret.code == 6001) {
api.toast({
msg : '支付已取消'
});
} else {
alert('支付失敗 code:' + err.code);
}
}
});
}
});
特別說明:不用aliPayPlus.config好像有問題。所以開發者微信和支付寶都用這個config方法。到這裏,完美實現支付。
結論:公鑰和私鑰的問題
另,由於開發者開發的軟件,不只是APP端能支付,必須電腦端(客戶網站)也要能支付。所以問題又來了:由於開發者用的是.net開發,所以PC端私鑰就不能採用pkcs8,而是用非pkcs8來生成密鑰對。經過測試,APP端使用的是RSA的密鑰對。那麼網站集成就用RSA2。 這樣網站和手機支付都通過了。
注意這裏,rsa2是網站使用的非pkcs8密鑰,RSA是手機使用的pkcs8密鑰。
新版的支付寶.net是沒有demo包,只能下載sdk,把sdk集成到自己的網站。採用官方提供的請求示例就可以實現網站支付了。多看看支付寶的文檔親們。
另外,支付寶這邊有技術員可以在線幫助,如果真的過不去就在線請求幫助。不然你搞到天黑都不一定實現。
另外,這裏也提供微信的第二種支付方案的代碼:
//微信支付 ======第二種方案
function wxpay() {
var wxPay = api.require('wxPay');
wxPay.config({
apiKey : '',
mchId : '',
partnerKey : '',
notifyUrl : ''
}, function(ret, err) {
//coding...
if (ret.status) {
//alert('配置商戶支付參數成功');
//alert('對接支付接口成功,即將跳轉支付界面。');
wxPay.pay({
description : '貨物運輸款', //商品或支付訂單簡要描述
totalFee : smoney, //訂單總金額,只能爲整數,單位:分(¥)
tradeNo : paytradeNo
}, function(ret, err) {
if (ret.status) {
paylog(2);
} else {
//alert(err.code);
//錯誤碼:
//-2(用戶取消)
//-1(可能的原因:簽名錯誤、未註冊APPID、項目設置APPID不正確、註冊的APPID與設置的不匹配、其他異常等)
//1(必傳參數缺失)
if (err.code == -2) {
alert("已經取消支付");
}
if (err.code == -1) {
alert("未知錯誤");
}
if (err.code == 1) {
alert("必傳參數缺失");
}
}
});
} else {
//alert(err.code);
alert("對接支付接口失敗");
}
});
}