2020年12月

回调的通知发现没有被正确处理,查看才知道<req_info>是经过加密的要自行解密

文档:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10

文中只有简单一句带过, 查了一下自带的 PHP SDK 也没有相关的代码

用key*对加密串B做AES-256-ECB解密(PKCS7Padding)

实现起来其实不难,就下面几行而已

define("PAY_KEY","3a6fbc07d5*********");
$hash = 'sjACArtC1yjo/WAlEnKyOcqP+avFCOCRR7Tn...AqXwmjIbonF/ECEqqs='; //密文
$strA = base64_decode($hash2);
$md5key = md5(PAY_KEY);
$raw = openssl_decrypt($strA,'AES-256-ECB',$md5key, OPENSSL_RAW_DATA); //解密的原文

解密出的原文:

<root>
<out_refund_no><![CDATA[202012281002345G4Y7R]]></out_refund_no>
<out_trade_no><![CDATA[202012281002345G4Y7R]]></out_trade_no>
<refund_account><![CDATA[REFUND_SOURCE_RECHARGE_FUNDS]]></refund_account>
<refund_fee><![CDATA[2]]></refund_fee>
<refund_id><![CDATA[50300406842020122805052137399]]></refund_id>
<refund_recv_accout><![CDATA[支付用户零钱]]></refund_recv_accout>
<refund_request_source><![CDATA[API]]></refund_request_source>
<refund_status><![CDATA[SUCCESS]]></refund_status>
<settlement_refund_fee><![CDATA[2]]></settlement_refund_fee>
<settlement_total_fee><![CDATA[2]]></settlement_total_fee>
<success_time><![CDATA[2020-12-28 22:05:57]]></success_time>
<total_fee><![CDATA[2]]></total_fee>
<transaction_id><![CDATA[4200000791202012284085971964]]></transaction_id>
</root>

不是什么难点,关键在于要给第四参数 OPENSSL_RAW_DATA 网上查到很多的方法至少前几页的都不对,要么是差最后一点要么舍近求远化简为繁。

特此备忘一下。