Maison > cadre php > PensezPHP > La station d'accueil ThinkPHP6 réalise le paiement WeChat H5

La station d'accueil ThinkPHP6 réalise le paiement WeChat H5

王雪芹
Libérer: 2020-09-09 17:41:20
original
3852 Les gens l'ont consulté

Le paiement WeChat H5 est une fonction indispensable pour les pages Web de commerce électronique mobile. Aujourd'hui, nous allons vous amener à implémenter le dock ThinkPHP6 pour implémenter le paiement WeChat H5.

1. Préparation

Effectuer un paiement WeChat nécessite également des qualifications d'entreprise et un compte de service WeChat certifié. Bien sûr, cela nécessite de payer 300 yuans à WeChat.

Après avoir spécifié les qualifications pour lesquelles postuler, nous ouvrons la plateforme de paiement WeChat, cliquons sur "Product Center" dans la navigation -> cliquez sur "H5 Payment" et remplissons le champ Et configurez les informations de nom de domaine pertinentes. Après l'avoir rempli, vous pouvez attendre l'examen et l'approbation officiels de WeChat. Si la demande n'est pas approuvée, WeChat vous informera de la raison jusqu'à ce que le paiement H5 soit activé avec succès.

2. Connectez-vous avec le paiement WeChat H5

Nous ouvrons d'abord le document officiel du paiement WeChat H5 Malheureusement, le paiement WeChat H5 ne nous donne pas le même paiement que Native. Paiement par code scan. Préparez le SDK&DEMO officiel. Sans SDK&DEMO officiel, nous devons l'intégrer nous-mêmes.

Le paiement WeChat H5 n'est pas difficile, nous lisons entièrement le chapitre de commande unifié.

1. Préparez les paramètres.

Le responsable de WeChat a répertorié les paramètres en détail pour nous. Il n'est pas difficile d'obtenir ces paramètres. Nous devons faire attention à deux paramètres : l'un est le signe de signature. et l'autre est le terminal IPspbill_create_ip.

Le responsable de la signature a donné des instructions détaillées. Nous trions les codes ASCII de petit à grand sous la forme clé1=valeur1&clé2=valeur2. Après le tri, StringA est obtenu, puis le StringA et la clé obtenus sont utilisés pour les épisser, et enfin ils sont convertis en majuscules.

Regardons le code détaillé :

public function index(){

        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//微信传参地址

        //1.获取调用统一下单接口所需必备参数
        $appid = 'wxff5b6b241a4fb11';//微信公众号appid
        $mch_id = '152223331';//微信支付商户号
        $key = 'b304911d6a9f7728d264dfd695ebae1';//自己设置的微信商家key
        $out_trade_no = time();//平台内部订单号
        $nonce_str=MD5(time());//随机字符串
        $body = '商品购买';//付款内容
        $total_fee = 1;//订单总金额,单位为分
        $spbill_create_ip = $this -> get_client_ip(); //获得用户设备IP
        $attach = 'weixinh5';//附加数据(自定义,在支付通知中原样返回)        
        $notify_url = "http://www.xxx.cn/mobile/WechatPay/notify";//通知地址
        $trade_type = 'MWEB';//交易类型,微信H5支付时固定为MWEB

        //2.将参数按照key=value的格式,并按照参数名ASCII字典序排序生成字符串
        $signA ="appid=$appid&attach=$attach&body=$body&mch_id=$mch_id&nonce_str=$nonce_str&notify_url=$notify_url&out_trade_no=$out_trade_no&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type";
        
        //3.拼接字符串
        $strSignTmp = $signA."&key=$key";

        //4.MD5加密后转换成大写
        $sign = strtoupper(MD5($strSignTmp));

        //5.拼接成所需XML格式
        $post_data = "<xml> 
                <appid>$appid</appid> 
                <attach>$attach</attach> 
                <body>$body</body> 
                <mch_id>$mch_id</mch_id> 
                <nonce_str>$nonce_str</nonce_str> 
                <notify_url>$notify_url</notify_url> 
                <out_trade_no>$out_trade_no</out_trade_no> 
                <spbill_create_ip>$spbill_create_ip</spbill_create_ip> 
                <total_fee>$total_fee</total_fee> 
                <trade_type>$trade_type</trade_type>
                <sign>$sign</sign> 
                </xml>";

    }
Copier après la connexion

Un $this est utilisé ici -> Pour obtenir l'adresse IP, regardons le code de cette méthode :

public function get_client_ip() {
        if(getenv(&#39;HTTP_CLIENT_IP&#39;) && strcasecmp(getenv(&#39;HTTP_CLIENT_IP&#39;), &#39;unknown&#39;)) {
            $ip = getenv(&#39;HTTP_CLIENT_IP&#39;);
        } elseif(getenv(&#39;HTTP_X_FORWARDED_FOR&#39;) && strcasecmp(getenv(&#39;HTTP_X_FORWARDED_FOR&#39;), &#39;unknown&#39;)) {
            $ip = getenv(&#39;HTTP_X_FORWARDED_FOR&#39;);
        } elseif(getenv(&#39;REMOTE_ADDR&#39;) && strcasecmp(getenv(&#39;REMOTE_ADDR&#39;), &#39;unknown&#39;)) {
            $ip = getenv(&#39;REMOTE_ADDR&#39;);
        } elseif(isset($_SERVER[&#39;REMOTE_ADDR&#39;]) && $_SERVER[&#39;REMOTE_ADDR&#39;] && strcasecmp($_SERVER[&#39;REMOTE_ADDR&#39;], &#39;unknown&#39;)) {
            $ip = $_SERVER[&#39;REMOTE_ADDR&#39;];
        }
        return preg_match ( &#39;/[\d\.]{7,15}/&#39;, $ip, $matches ) ? $matches [0] : &#39;&#39;;
    }
Copier après la connexion

2. Postez les paramètres à l'adresse officielle.

L'adresse officielle est l'adresse URL : https://api.mch.weixin.qq.com/pay/unifiedorder. Cette adresse ne peut pas être modifiée. Nous publions les paramètres XML préparés.

$dataxml = $this -> httpRequest($url,'POST',$post_data) ;

La méthode httpRequest ici est utilisée pour envoyer des données de publication :

public function httpRequest($url, $method, $postfields = null, $headers = array(), $debug = false) {
        $method = strtoupper($method);
        $ci = curl_init();
        /* Curl settings */
        curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
        curl_setopt($ci, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0");
        curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 60); /* 在发起连接前等待的时间,如果设置为0,则无限等待 */
        curl_setopt($ci, CURLOPT_TIMEOUT, 7); /* 设置cURL允许执行的最长秒数 */
        curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
        switch ($method) {
        case "POST":
            curl_setopt($ci, CURLOPT_POST, true);
            if (!empty($postfields)) {
            $tmpdatastr = is_array($postfields) ? http_build_query($postfields) : $postfields;
            curl_setopt($ci, CURLOPT_POSTFIELDS, $tmpdatastr);
            }
            break;
        default:
            curl_setopt($ci, CURLOPT_CUSTOMREQUEST, $method); /* //设置请求方式 */
            break;
        }
        $ssl = preg_match(&#39;/^https:\/\//i&#39;,$url) ? TRUE : FALSE;
        curl_setopt($ci, CURLOPT_URL, $url);
        if($ssl){
        curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
        curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE); // 不从证书中检查SSL加密算法是否存在
        }
        curl_setopt($ci, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ci, CURLOPT_MAXREDIRS, 2);/*指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的*/
        curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ci, CURLINFO_HEADER_OUT, true);
        $response = curl_exec($ci);
        $requestinfo = curl_getinfo($ci);
        if ($debug) {
            echo "=====post data======\r\n";
            var_dump($postfields);
            echo "=====info===== \r\n";
            print_r($requestinfo);
            echo "=====response=====\r\n";
            print_r($response);
        }
        curl_close($ci);
        return $response;
    }
Copier après la connexion

Jetons un coup d'œil au code complet :

public function index(){

        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//微信传参地址

        //1.获取调用统一下单接口所需必备参数
        $appid = &#39;wxff5b68b241a4fb11&#39;;//微信公众号appid
        $mch_id = &#39;1522223331&#39;;//微信支付商户号
        $key = &#39;b304911d6a19f7728d264dfd695ebae1&#39;;//自己设置的微信商家key
        $out_trade_no = time();//平台内部订单号
        $nonce_str=MD5(time());//随机字符串
        $body = &#39;商品购买&#39;;//付款内容
        $total_fee = 1;//订单总金额,单位为分
        $spbill_create_ip = $this -> get_client_ip(); //获得用户设备IP
        $attach = &#39;weixinh5&#39;;//附加数据(自定义,在支付通知中原样返回)        
        $notify_url = "http://www.dongpaiweb.cn/mobile/WechatPay/notify";//通知地址
        $trade_type = &#39;MWEB&#39;;//交易类型,微信H5支付时固定为MWEB

        //2.将参数按照key=value的格式,并按照参数名ASCII字典序排序生成字符串
        $signA ="appid=$appid&attach=$attach&body=$body&mch_id=$mch_id&nonce_str=$nonce_str&notify_url=$notify_url&out_trade_no=$out_trade_no&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type";
        
        //3.拼接字符串
        $strSignTmp = $signA."&key=$key";

        //4.MD5加密后转换成大写
        $sign = strtoupper(MD5($strSignTmp));

        //5.拼接成所需XML格式
        $post_data = "<xml> 
                <appid>$appid</appid> 
                <attach>$attach</attach> 
                <body>$body</body> 
                <mch_id>$mch_id</mch_id> 
                <nonce_str>$nonce_str</nonce_str> 
                <notify_url>$notify_url</notify_url> 
                <out_trade_no>$out_trade_no</out_trade_no> 
                <spbill_create_ip>$spbill_create_ip</spbill_create_ip> 
                <total_fee>$total_fee</total_fee> 
                <trade_type>$trade_type</trade_type>
                <sign>$sign</sign> 
                </xml>";

        //6.以POST方式向微信传参,并取得微信返回的支付参数
        $dataxml = $this -> httpRequest($url,&#39;POST&#39;,$post_data);
        $objectxml = (array)simplexml_load_string($dataxml, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA); //将微信返回的XML转换成数组
        if($objectxml[&#39;return_code&#39;] == &#39;SUCCESS&#39;){
            if($objectxml[&#39;result_code&#39;] == &#39;SUCCESS&#39;)//如果这两个都为此状态则返回mweb_url,详情看‘统一下单’接口文档
                $return_url = "http://www.dongpaiweb.cn/mobile/WechatPay/return";//支付后跳转地址
                $urls = $objectxml[&#39;mweb_url&#39;] . &#39;&redirect_url=&#39; . urlencode($return_url);
                
                //访问这个url  但是在用下面的方法访问是 报错商家信息有误 所以我把url 放到视图中 跳转
                // header("Location:$urls");
                return view(&#39;mobile_pay&#39;,[
                    &#39;url&#39;=>$urls
                ]);
                //mweb_url是微信返回的支付连接要把这个连接分配到前台
            if($objectxml[&#39;result_code&#39;] == &#39;FAIL&#39;){
                return $err_code_des = $objectxml[&#39;err_code_des&#39;];
            }
                
        }

    }
Copier après la connexion

Il faut faire attention, WeChat renvoie les paramètres return_code et result_code ne représentent qu'une communication réussie, pas une transaction réussie. La transaction réussit uniquement lorsque return_code et result_code sont tous deux SUCCESS.

Enfin, nous devons faire la distinction entre l'adresse de notification et l'adresse de retour. L'adresse de notification est une notification de paiement de WeChat au commerçant. Elle est identique au paiement natif et est envoyée sous la forme d'une donnée. flux. L'adresse de retour est la page de renvoi après le paiement par l'utilisateur et est visible par l'utilisateur.

Ce qui précède est l'introduction pertinente à l'amarrage ThinkPHP6 pour implémenter le paiement WeChat H5, tout le monde, allez !

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:php.cn
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