HUAWEI In-App Purchase 訂閱制後端流程

前言

本篇紀錄以後端角度來串接 HUAWEI IAP 訂閱制的流程

前置作業

HWAWEI-Developer 配置AppGallery Connect

若是用 SHA256WithRSA 來解密,則記得 使用SHA256WithRSA/PSS签名算法 的開關要關閉

APP內訂閱流程

HWAWEI-Developer 商品购买流程

當 HWAWEI IAP 建立商店訂單,取得加密訂單、明文訂單後,由後端來驗證訂單

後端收到訂單後,需將加密訂單、明文訂單與後端的公鑰做驗證

.Net Framework 可透過 套件 Portable.BouncyCastle 1.9.0 來驗證

string publicKey = "MIIBo...";
string signedData = "{\"environment\":\"Sandbox\",\"notificationType\":3, ...";
string signature = "bFiqXX...";

byte[] publicKeyBytes = Convert.FromBase64String(publicKey);
byte[] purchaseInfoBytes = Encoding.UTF8.GetBytes(signedData);
byte[] signatureBytes = Convert.FromBase64String(signature);

var pubKey = PublicKeyFactory.CreateKey(publicKeyBytes);
ISigner signer = SignerUtilities.GetSigner("SHA-256withRSA");
signer.Init(false, pubKey);
signer.BlockUpdate(purchaseInfoBytes, 0, purchaseInfoBytes.Length);
var isVerify = signer.VerifySignature(signatureBytes);

驗證成功後,則可照業務邏輯跑完訂單流程

後端建單成功後,API 吐成功狀態讓 AppGallery App 確認訂單

自動續訂訂閱流程

要收華為訂單通知,需在後台配置後端 API,供華為 Server 呼叫

需注意華為對後端 API 的限定,需為 HTTPS、合法憑證,並且 TLS Cipher Suite 也有規定至少要有以下一種 Cipher
ECDHE-RSA-AES128-GCM-SHA256、ECDHE-ECDSA-AES128-GCM-SHA256、ECDHE-RSA-AES256-GCM-SHA384或ECDHE-ECDSA-AES256-GCM-SHA384
參考 HWAWEI-Developer 关键事件通知版本v2

以 statusUpdateNotification.notificationType 來判斷通知類型
HWAWEI-Developer notificationType

statusUpdateNotification.latestReceiptInfo.purchaseToken = 訂閱型商品正常續訂時不會更改,該欄位可跟著訂單資訊存下來,可透過該欄位往前尋找前幾筆訂閱單、對應會員
statusUpdateNotification.latestReceiptInfo.orderId = 訂單編號
statusUpdateNotification.latestReceiptInfo.productId = 產品ID

訂閱通知

statusUpdateNotification.notificationType = 3 (INTERACTIVE_RENEWAL 商店頁訂閱)、7 (RENEWAL_RECURRING 自動續訂)

華為沒有區分 APP內訂閱、商店頁訂閱
收到訂閱通知驗證後,確認品項正確後即可走建單流程

需透過 statusUpdateNotification.latestReceiptInfo.purchaseToken
來反查該訂閱單是第幾期、主訂閱單的所屬會員,用以建單

若是新一筆的商店訂閱單,因 purchaseToken 就會是新的,則無法用上面方式反查主訂閱單找到所屬會員,因為該筆就是主訂閱單
需要跟 GP 商店頁訂閱處理方式一樣,先把訂單資訊暫存下來
等會員登入 APP 後,則 APP 再把訂閱中的訂單編號拋到後端,後端再把訂閱單跟會員 Mapping 起來

取消訂閱通知

statusUpdateNotification.notificationType = 5 (RENEWAL_STOPPED 會員取消訂閱)

收到此通知後,抓取 statusUpdateNotification.latestReceiptInfo.orderId 該訂單編號來更新訂閱狀態

恢復訂閱通知

statusUpdateNotification.notificationType = 6 (RENEWAL_RESTORED 會員恢復訂閱)

收到此通知後,抓取 statusUpdateNotification.latestReceiptInfo.orderId 該訂單編號來更新訂閱狀態


轉載請註明來源,若有任何錯誤或表達不清楚的地方,歡迎在下方評論區留言,也可以來信至 leozheng0621@gmail.com
如果文章對您有幫助,歡迎斗內(donate),請我喝杯咖啡

斗內💰

×

歡迎斗內

github