PHP語言之華為應用內支付IAP驗簽


背景描述

項目對接華為HMS SDK的應用內支付IAP SDK3.x以后,支付成功后,可從PurchaseResultInfo對象中獲取到購買數據InAppPurchaseData及其簽名數據,需要使用在華為AppGallery Connect分配的公鑰進行簽名驗證。

具體參考文檔如下描述:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/dev-guide-0000001050130254#ZH-CN_TOPIC_0000001050130254__section183174113342

代碼開發

這里隨手用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在線運行工具,比如我這里隨時用的:

https://tool.lu/coderunner/

復制代碼進去后,運行返回0表示數據均正常。

在這里插入圖片描述


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

原作者:Mayism


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM