背景描述
項目對接華為HMS SDK的應用內支付IAP SDK3.x以后,支付成功后,可從PurchaseResultInfo對象中獲取到購買數據InAppPurchaseData及其簽名數據,需要使用在華為AppGallery Connect分配的公鑰進行簽名驗證。
具體參考文檔如下描述:
代碼開發
這里隨手用PHP寫了一個小demo,驗證拿到的購買數據、簽名數據和公鑰能否正常驗簽成功。同時也分享給大家,方便大家快速定位問題,比如公鑰錯誤等問題。
代碼
<?php
//收到的實際支付回調,不要做任何處理,請復制原始數據。
//這里xxxx等信息都是我屏蔽了一些個人數據,實際大家復制自己的回調數據就好
$content = '{"autoRenewing":false,"orderId":"201912250949586652ebf220c1.10xxxx75","packageName":"com.example.xxxxxxexample_netease.huawei","applicationId":10xxxx75,"kind":0,"productId":"3","productName":"test33333","purchaseTime":1577238608000,"purchaseTimeMillis":1577238608000,"purchaseState":0,"developerPayload":"09815772385983110000000191996123","purchaseToken":"0000016f3abf3a78a4ef7b217523ea5a346825ab632c152b864c2e5251433c9d599c5986ab8c89b1.1.10xxxx75","consumptionState":0,"acknowledged":0,"currency":"CNY","price":100,"country":"CN","payOrderId":"Aed0f1fbd9929f803d9d23b523b14575","payType":"4"}';
//sign值需要使用回調中的原始值,不要做urlencode或urldecode處理。
$sign = 'IuCnJI3bCDr92uomUbxamp6VeC8vN+o3GTtB7aVwTGpkk9QgeR9KdUjDya1tJXKX8HZgTTLpj7v4A1lP8xrOq3+knykn32Tup6STnn4qpee8J3sS9kjpIHmhIbh3QfnsHksCaT4ib9BurIWnH7yEtNlwqmOOibJw8FgFXofrfPsDwjuCy4/X9rlbimjmyAiFZLXCTNQoGollqUVEjqabhjh/a+VY89A6Z02F2bJkes39a7lQMer42egha86w65L3UYYSLOyxQPIfIZ1BG5yirZN4JgcD17CMk+vQvtVDXhC+e4xN//txWlG/qIgviZbmhLFGjA/gfP0o8LpY7booiA==';
//支付公鑰需要處理成以下RSA格式,中間內容為公鑰64位換行
$pubKey = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq7iOD9qLMxMCEsY+l+IE
6kdI9HKHQoDG29ebPZFD+U1pdDewmkEcQzv/k0NmE9oeNIcxUqhg7ZwRrQ0g9xje
BCkiLTg4DOygOPOcZykuKZXDv/9aFn6FR5BVCrrOzmeR+/aEYcZZp86iWX+W4BdJ
L41i8qYonVRD6sDNuidAdg0UkNMPVRiHd5EYBgRHpPma7oeRVqfX4Iq/rL4DFOpu
uLiaLKmWSMOCLnIH+EXjjw3ttJOrB4Rq2fq6KrORgc8JMq2TPf/kK6r8NW9eWRWa
zmFvAZ8bUA7Idu4W8Z4SENwEO+ZeyWQx5I/piYEmBvmn3dy2l2bP3cZMUBVACkAE
jwIDAQAB
-----END PUBLIC KEY-----';
$openssl_public_key = @openssl_get_publickey($pubKey);
// SHA256 要根據實際回調中signType字段的取值確定,signType=RSA256時 使用以下字段值,其他任何情況都是用SHA1
$ok = @openssl_verify($content, base64_decode($sign), $openssl_public_key,'SHA256');
@openssl_free_key($openssl_public_key);
$result = "";
if($ok)
{
$result = "0";// success
}
else
{
$result = "1";// failure
}
$res = "{ \"result\": $result} ";
echo $res;
?>
運行
直接百度搜索個PHP在線運行工具,比如我這里隨時用的:
復制代碼進去后,運行返回0表示數據均正常。

原文鏈接:https://developer.huawei.com/consumer/cn/forum/topic/0202460337200900948?fid=0101271690375130218
原作者:Mayism
