Maison > Applet WeChat > Développement WeChat > le corps du texte

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

藏色散人
Libérer: 2021-07-15 13:47:09
avant
4151 Les gens l'ont consulté

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;
    }
Copier après la connexion
.

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;
    }
Copier après la connexion

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;
    }
Copier après la connexion

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;//取刚刚存的最后一条回调信息
    }
Copier après la connexion

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);
    }
Copier après la connexion

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!

Étiquettes associées:
source:jianshu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal