本站即日起正式部署SSL证书启用https安全连接, 联系站长:416326801#qq.com(#改成@)

微信支付退款结果通知解密

标签: PHP Weixin wxpay

微信支付退款结果通知解密步骤如下: 

第一步,对商户密钥key进行MD5加密,得到32位小写加密串StringA

key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 

第二步,使用StringA作为key,对参数加密串进行AES-256(ECB模式,PKCS7Padding)解密,得到加密前参数。


第一步很好理解, 第二步微信并没有给出demo, 经测试可用的PHP代码如下

注意:示例函数的$key不是商户秘钥,需要事先进行MD5加密

明文=refund_decrypt(密文,MD5(商户秘钥));

$refund_xml_string = refund_decrypt($weixin_post_string, md5($weixin_key));

function refund_decrypt($str, $key) {
        $str = base64_decode($str);
        $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
        $block = mcrypt_get_block_size('rijndael_128', 'ecb');
        $pad = ord($str[($len = strlen($str)) - 1]);
        $len = strlen($str);
        $pad = ord($str[$len - 1]);
        return substr($str, 0, strlen($str) - $pad);
}

解密结果示例

解密后:

<root>
<out_refund_no><![CDATA[R4001312001201707262674894706_4]]></out_refund_no>
<out_trade_no><![CDATA[201707260201501501005710775]]></out_trade_no>
<refund_account><![CDATA[REFUND_SOURCE_UNSETTLED_FUNDS]]></refund_account>
<refund_fee><![CDATA[15]]></refund_fee>
<refund_id><![CDATA[50000203702017072601461713166]]></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[15]]></settlement_refund_fee>
<settlement_total_fee><![CDATA[100]]></settlement_total_fee>
<success_time><![CDATA[2017-07-26 02:45:49]]></success_time>
<total_fee><![CDATA[100]]></total_fee>
<transaction_id><![CDATA[4001312001201707262674894706]]></transaction_id>
</root>

退款结果图:

微信支付退款测试.jpg

{"errcode":45047,"errmsg":"out of response count limit hint]"}

标签: Weixin

微信公众号发送客服消息返回错误码45047, 官方并没有给出45047的具体含义.

根据字面意思和测试结果, 该错误值代表: 对同一用户频发发送客服消息超过限制, 避免对用户造成骚扰. 

一般只会发调试的时候出现, 解决办法: 接收人给公众号发条消息, 或者换个openid测试. 

构建微信公众号被动回复image图片消息xml

标签: XML Weixin

public static function transmitImage($message) {
    if( !is_array($message) || empty($message) ) {
        return;
    }
    $xmlTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId>%s</MediaId></Image></xml>";
    $xml = sprintf($xmlTpl, $message['ToUserName'], $message['FromUserName'], $message['CreateTime'], $message['Image']['MediaId']);
    return $xml;
}

构建微信公众号被动回复news多图文消息xml

标签: XML Weixin


 public static function transmitNews($message) {
    if( !is_array($message) || empty($message) ) {
        return;
    }
    $itemTpl = "<item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item>";
    $item_str = "";
    foreach ( $message['Articles'] as $item ) {
        $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
    }
    $xmlTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>%s</ArticleCount><Articles>$item_str</Articles></xml>";
    $xml = sprintf($xmlTpl, $message['ToUserName'], $message['FromUserName'], $message['CreateTime'], $message['ArticleCount']);
    return $xml;
}

微信html弹出点击右上角分享到朋友圈

标签: HTML Weixin

html

<a href="javascript:;" onclick="document.getElementById('mcover').style.display='block';">分享到朋友圈</a>

<div id="mcover" onclick="document.getElementById('mcover').style.display='';" style="display: none;">
     <img src="/public/images/guide.png">
</div>

guide.png

js

#mcover {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0, 0.7);
    display: none;
    z-index: 20000;
}
#mcover img {
    position: fixed;
    right: 18px;
    top: 5px;
    width: 260px;
    height: 180px;
    z-index: 999;
}