微信native支付

1.先来上个官网文档地址:产品介绍-Native支付 | 微信支付商户平台文档中心
2.首先看文档中的接入前准备,先配置好验证微信数据所需的签名、appid,证书等数据内容。
3.下载官方提供的sdk包,到你的项目中,并配置好对应的命名空间,控制器方法引用。
4.打开sdk中的vendor/wechatpay/wechatpay/README.md文件。


5.复制证书下载的相关代码,复制到你的控制器方法中。商户api私钥和微信平台证书都是文件形式的,我放到了vendor同级目录的cert和apiclient_cert文件夹下。然后用绝对路径引用他们。(z证书文件要好好保存,要不然再次用会很麻烦)
6.验证证书签名成功后,就可以调用生成支付二维码链接的信息了。还是上个md文件

7.此步骤下面可以编写你的业务逻辑。(注意:微信支付金额是按分为单位,若你接口中传的1元,则你上图中total字段要乘以100才是1元)

8.异步回调验证签名:官方文档支付成功回调通知_Native支付|微信支付合作伙伴文档中心

<?php
    /**
     * 获取自定义的header数据
     */
    function get_all_headers(){

        // 忽略获取的header数据
        $ignore = array('host','accept','content-length','content-type');
        $headers = array();
        foreach($_SERVER as $key=>$value){
            if(substr($key, 0, 5)==='HTTP_'){
                $key = substr($key, 5);
                $key = str_replace('_', ' ', $key);
                $key = str_replace(' ', '-', $key);
                $key = strtolower($key);
                if(!in_array($key, $ignore)){
                    $headers[$key] = $value;
                }
            }
        }
        return $headers;
    }


    public function wx_notify_url()
    {
        $headerarr=$this->get_all_headers();
        testLog('notifyOrder', date('Y-m-d H:i:s') . "【微信充值正常测试回调data】\r\n" . json_encode($headerarr) . "\r\n");
        $inWechatpaySignature = $headerarr['wechatpay-signature'];// 请根据实际情况获取
        $inWechatpayTimestamp = $headerarr['wechatpay-timestamp'];// 请根据实际情况获取
        $inWechatpaySerial = $headerarr['wechatpay-serial'];// 请根据实际情况获取
        $inWechatpayNonce = $headerarr['wechatpay-nonce'];// 请根据实际情况获取
        $inBody = file_get_contents("php://input");;// 请根据实际情况获取,例如: file_get_contents('php://input');
        testLog('notifyOrder', date('Y-m-d H:i:s') . "【微信充值正常测试回调time】\r\n" . json_encode($inWechatpayNonce) . "\r\n");
        $apiv3Key = "";
        // 根据通知的平台证书序列号,查询本地平台证书文件,
        // 假定为 `/path/to/wechatpay/inWechatpaySerial.pem`
        $platformPublicKeyInstance = Rsa::from('file:///cert/wechatpay.pem', Rsa::KEY_TYPE_PUBLIC);

      // 检查通知时间偏移量,允许5分钟之内的偏移
        $timeOffsetStatus = 300 >= abs(Formatter::timestamp() - (int)$inWechatpayTimestamp);
        $verifiedStatus = Rsa::verify(
        // 构造验签名串
            Formatter::joinedByLineFeed($inWechatpayTimestamp, $inWechatpayNonce, $inBody),
            $inWechatpaySignature,
            $platformPublicKeyInstance
        );

        if ($timeOffsetStatus && $verifiedStatus) {
            // 转换通知的JSON文本消息为PHP Array数组
            $inBodyArray = (array)json_decode($inBody, true);
            $ciphertext = $inBodyArray['resource']['ciphertext'];
            $nonce = $inBodyArray['resource']['nonce'];
            $aad = $inBodyArray['resource']['associated_data'];
            // 加密文本消息解密
            $inBodyResource = AesGcm::decrypt($ciphertext, $apiv3Key, $nonce, $aad);
            // 把解密后的文本转换为PHP Array数组
            $result = (array)json_decode($inBodyResource, true);
        if ($result["trade_state"] == "SUCCESS" && $result["trade_state_desc"] == "支付成功") {
             //此处写支付成功后的业务逻辑
        }
    }
}

回调的所有数据都是在header头中获取的,上述代码有相关获取方式。

9.验证回调的数据可打印到某个文件中,若得到信息下面验证缺不通过,可把回调信息直接放到接口中去访问,看是哪一步出现了报错异常导致,希望我们都能尽快get到这个新技能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值