uniapp蘋果內購流程
關於支付這塊的,有微信和支付寶不就夠了麼,何必還要再多搞一個蘋果支付呢?多此一舉的事,而且蘋果支付還得分去30%的錢,哪個老闆能受得了?
是老闆願意搞蘋果支付麼?不,是蘋果IOS市場太強制了,對於app內有虛擬物品交易的,一律需要接上蘋果支付,不然駁回上架稽核。所以說,想要上架蘋果app store的話,如果駁回資訊叫你搞,
很大程度上就是非搞不可了。
蘋果支付,我是用App plus的支付api,呼叫比較簡單,可以去了解下plus支付文件
使用前有兩點要了解的
1、登入iTunes Connet 應用後臺,建立App內購專案,設定好稅務和銀行卡等配置資訊,具體操作基本分三步,可參考https://help.apple.com/app-store-connect/#/devb57be10e7
2、HbuilderX要打自定義除錯基座,打測試包前,記得要勾選Apple應用內支付
app內使用呼叫方法
1、首先必須調取plus.payment.getChannels 獲取支付通道,拿到id為‘appleiap’的通道,我這裡就將它賦值給iap變數,支付方法都在這iap裡
2、呼叫iap的requestOrder
方法,向蘋果伺服器請求獲取商品的詳細資訊,就是內購專案列表,支付前必須先呼叫這個方法獲取訂單資訊,或者支付失敗
3、這一步就開始調取支付了,plus的api支付,plus.payment.request(channel, statement, successCB, errorCB
)方法發起支付請求,
引數:
- channel: ( PaymentChannel ) 必選 支付通道
指定支付操作的通道,通過getChannels介面獲取。
- statement:
(
String
|
JSON
|
OrderStatementIAP
)
必選 支付訂單資訊
支付訂單資訊,由支付通道定義的資料格式,通常是由業務伺服器生成或向支付伺服器獲取,是經過加密的字串資訊。
- successCB:
(
PaymentSuccessCallback
|
IapPaymentSuccessCallback
請求支付成功時觸發,用於返回支付結果。
- errorCB:
(
PaymentErrorCallback
)
可選 請求支付失敗回撥函式
請求支付失敗時觸發,用於返回錯誤資訊。
uniapp例項
//首先注入iap,用於蘋果支付 var iap = null; plus.payment.getChannels(function(channels) { console.log(channels,"why"); for (var i in channels) { var channel = channels[i]; // 獲取 id 為 'appleiap' 的 channel if (channel.id === 'appleiap') { iap = channel; } } }, function(e) { console.log("獲取iap支付通道失敗:" + e.message); }); function restoreComplateRequest() { iap.restoreComplateRequest({}, function(results) { // results 格式為陣列存放恢復的IAP商品交易資訊物件 IAPTransaction,需要將返回的支付憑證傳給後端進行二次認證 }); } import qs from 'qs'; export default{ data() { return { vi: '' } },
onShow(){
if(this.restoreFlag){
restoreComplateRequest();
}
}, methods:{ payfn(){ if(!iap){return false;} this.onefn(); }, onefn(){ // ids 為在蘋果開發者後臺配置的應用內購專案的標識集合 var ids = ['my25']; // iap 為剛剛獲取的`appleiap`支付通道 iap.requestOrder(ids, (e)=> { // 獲取訂單資訊成功回撥方法 console.log('requestOrder success: ' + JSON.stringify(e)); this.twofn(); }, function(e) { // 獲取訂單資訊失敗回撥方法 console.log('requestOrder failed: ' + JSON.stringify(e)); }); }, twofn(){ this.restoreFlag = true; // 呼叫支付介面時標記 restoreFlag = true , 實際應用請將標記儲存在 storage 中 plus.payment.request(iap, { productid: "my25", // 使用者標識 optimize: true // 設定 optimize: true 解決丟單問題 }, (result)=> {
this.restoreFlag = false; // 支付成功清除標記 restoreFlag = false // 支付成功,result 為 IAP商品交易資訊物件 IAPTransaction 需將返回的支付憑證傳給後端進行二次認證 }, function(e) { console.log(e,"錯誤"); // 支付失敗的時候需要呼叫一下 restoreComplateRequest 方法 restoreComplateRequest() }); } } }
注意事項
- 使用沙盒環境測試時每次呼叫支付介面需要換一個新的測試賬號或商品,同一個賬號多次購買同一個商品可能會沒有回撥;
- productid是內購專案的產品ID(自定義的名稱,怎麼方便開發就怎麼取)