Maison  >  Article  >  Applet WeChat  >  [Record] Utilisation de l'applet PHP WeChat Paiement WeChat v3

[Record] Utilisation de l'applet PHP WeChat Paiement WeChat v3

藏色散人
藏色散人avant
2021-07-15 13:47:094152parcourir

J'ai écrit un petit programme et j'ai découvert que le paiement WeChat avait une version v3, alors j'ai pensé à accepter un nouveau paiement. Il s'est avéré qu'il était toxique, alors j'ai enregistré le processus

Tout d'abord, j'ai passé la commande de manière unifiée

//统一下单
public function wechartAddOrder($name,$ordernumber,$money,$openid){
        $url = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi";
        $urlarr = parse_url($url);
        $appid = config('config.appId');//appID
        $mchid = config('config.mchid');//商户ID
        $xlid = config('config.apiXL');//API序列号
        $data = array();
        $randstr = getRanStr(16,false);//随机字符串长度不超过32
        $time = time();
        $data['appid'] = $appid;
        $data['mchid'] = $mchid;
        $data['description'] = $name;//商品描述
        $data['out_trade_no'] = $ordernumber;//订单编号
        $data['notify_url'] = "https://www.xffly.cn/api/admin/order/wechartCallback";//回调接口
//      $data['amount']['total'] = $money;//金额
        $data['amount']['total'] = 1;
        $data['payer']['openid'] = $openid;//用户openID
        $data = json_encode($data); 
        $key = $this->getSign($data,$urlarr['path'],$randstr,$time);//签名
        $token = sprintf('mchid="%s",serial_no="%s",nonce_str="%s",timestamp="%d",signature="%s"',$mchid,$xlid,$randstr,$time,$key);//头部信息
        $header  = array(
            'Content-Type:'.'application/json; charset=UTF-8',
            'Accept:application/json',
            'User-Agent:*/*',
            'Authorization: WECHATPAY2-SHA256-RSA2048 '.$token
        );  
        $ret = curl_post_https($url,$data,$header);
        return $ret;
    }
.

Calcul de la signature, je l'ai également fait plusieurs fois selon le document

//微信支付签名
public function getSign($data=array(),$url,$randstr,$time){
        $str = "POST"."\n".$url."\n".$time."\n".$randstr."\n".$data."\n";
        $key = file_get_contents('apiclient_key.pem');//在商户平台下载的秘钥
        $str = getSha256WithRSA($str,$key);
        return $str;
    }

Obtenez le prepay_id via l'interface de commande unifiée
Utilisez son interface wx.requestPayment pour initier le paiement dans le mini programme, donc il n'a pas beaucoup de contenu. Je ne publierai pas le code. Suivez simplement le document
Dans lequel une signature est requise pour lancer le paiement. En même temps, Reason

//调起支付的签名
public function getWechartSign($post){
        $data = array();
        $data['timeStamp'] = $post['timeStamp'];
        $data['nonceStr'] = $post['str'];
        $data['package'] = $post['package'];
        $str = config('config.appId')."\n".$data['timeStamp']."\n".$data['nonceStr']."\n".$data['package']."\n";
        $key = file_get_contents('apiclient_key.pem');
        $str = getSha256WithRSA($str,$key);
        return $str;
    }

Le point clé est le rappel du paiement réussi, ce qui est tout simplement toxique
L'information json. renvoyé sera vide une fois analysé par json_decode. Si vous le copiez et l'analysez, il peut être analysé. Il se peut qu'il contienne des informations de nomenclature, mais cela ne fonctionnera pas même si vous le faites, utilisez htmlspecialchars_decode pour y échapper. l'outil de débogage peut réussir, mais le vrai paiement WeChat ne fonctionne toujours pas. Au final, il n'y a aucun moyen, vous pouvez le récupérer vous-même et vous pouvez l'utiliser

//微信回调写入日志文件并返回
    public function writeWechartLog($post){
        if(!is_dir("upload/log")){
           mkdir("upload/log",0777,true);
        }
        $log = fopen("upload/log/wechart.txt", "a+");
        if(is_array($post)){
            $post = json_encode($post);
        }
        fwrite($log, $post."\n");
        fclose($log);
        $read = fopen("upload/log/wechart.txt", "r");
        fseek($read, -1, SEEK_END);
        $s = '';
        while (($c = fgetc($read)) !== false) {
            if ($c == "\n" && $s) break;
            $s = $c . $s;
            fseek($read, -2, SEEK_CUR);
        }
        fclose($read);
        return $s;//取刚刚存的最后一条回调信息
    }

Dans les informations de rappel, là. est quelque chose de crypté, vous devez encore le déchiffrer, ce sont les données que vous avez extraites du journal
sodium_crypto_aead_aes256gcm_decrypt Cette méthode de décryptage nécessite que PHP étende sodium

//微信回调解密
    public function wechartDecrypt($str) {
        $str = htmlspecialchars_decode($str,ENT_COMPAT);
        $post = json_decode($str,true);
        $key = config("config.apiv3Key");//商户平台设置的api v3 密码
        $text = base64_decode($post['resource']['ciphertext']);
        $str = sodium_crypto_aead_aes256gcm_decrypt($text,$post['resource']['associated_data'],$post['resource']['nonce'],$key);
        return json_decode($str,true);
    }

Ensuite, le traitement commercial après avoir obtenu les informations de rappel

J'ai revu cela Amis de l'article, si vous savez pourquoi les informations json renvoyées par le rappel WeChat ne peuvent pas être utilisées directement, dites-le-moi, merci, je ne l'ai pas compris après une journée de recherche, donc je ne peux les traiter que comme ça en premier. ..

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer