微信支付退款回调解密

退款结果通知

解密步骤如下:

(1)对加密串A做base64解码,得到加密串B
(2)对商户key做md5,得到32位小写key* ( key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 )

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

举例如下:

<xml>
<return_code>SUCCESS</return_code>
   <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
   <mch_id><![CDATA[10000100]]></mch_id>
   <nonce_str><![CDATA[TeqClE3i0mvn3DrK]]></nonce_str>
   <req_info><![CDATA[T87GAHG17TGAHG1TGHAHAHA1Y1CIOA9UGJH1GAHV871HAGAGQYQQPOOJMXNBCXBVNMNMAJAA]]></req_info>
</xml>

req_info解密后的示例:

<root>
<out_refund_no><![CDATA[131811191610442717309]]></out_refund_no>
<out_trade_no><![CDATA[71106718111915575302817]]></out_trade_no>
<refund_account><![CDATA[REFUND_SOURCE_RECHARGE_FUNDS]]></refund_account>
<refund_fee><![CDATA[3960]]></refund_fee>
<refund_id><![CDATA[50000408942018111907145868882]]></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[3960]]></settlement_refund_fee>
<settlement_total_fee><![CDATA[3960]]></settlement_total_fee>
<success_time><![CDATA[2018-11-19 16:24:13]]></success_time>
<total_fee><![CDATA[3960]]></total_fee>
<transaction_id><![CDATA[4200000215201811190261405420]]></transaction_id>
</root>
阅读 6k
1 个回答
很多人包括我自己一开始认为是全部解密,其实是只对 req_info 字段进行解密,现在贴出源码希望对大家有所帮助

退款回调

function notifyRefundAction(){
    $xml = file_get_contents('php://input');//接收回调数据
    $data = xmlToArray($xml);//将XML转换成数组
    if($data['return_code'] == 'SUCCESS'){
        $refundDecryptData = refundDecrypt($data['req_info']);//解密
        $refundData = xmlToArray($refundDecryptData);//将XML转换成数组
        
        /**处理事务逻辑**/
        
        if('处理完成'){
            echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
        } else {
            //记录错误日志
        }
    } else {
        //记录错误日志  $data
    }
}

解密

function refundDecrypt($str) {
    $decrypt = base64_decode($str,true);
    $key = md5('商户key');
    return openssl_decrypt($decrypt , 'aes-256-ecb',$key, OPENSSL_RAW_DATA);
}

XML转数组

function xmlToArray($xml){
    libxml_disable_entity_loader(true);
    return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题