Comment mettre en œuvre la fonction de paiement du mini-programme

coldplay.xixi
Libérer: 2020-08-31 10:41:06
original
13101 Les gens l'ont consulté

La méthode pour mettre en œuvre la fonction de paiement du mini programme : demandez d'abord le paiement sur le front-end, et demandez au serveur WeChat sur le back-end ; puis le back-end accepte le serveur WeChat et renvoie les données ; puis le front-end initie le paiement ; enfin le back-end accepte le rappel du serveur WeChat.

Comment mettre en œuvre la fonction de paiement du mini-programme

[Recommandations d'apprentissage associées : Tutoriel de développement de petits programmes]

Méthodes de mise en œuvre de la fonction de paiement du mini programme :

1. Demande de paiement frontale

La demande de paiement frontale est. pour transporter simplement les exigences de paiement Les données, telles que l'ID utilisateur, le montant du paiement, l'ID de l'ordre de paiement, etc. sont liées à votre logique métier ou sont liées aux données requises pour l'étape suivante de demande de l'interface de commande unifiée du paiement du serveur WeChat** , utilisez l'applet WeChat wx.request( ) Allez pour demander l'interface de paiement backend.

2. Le backend demande au serveur WeChat

Une fois que le backend a reçu la demande de paiement envoyée par le frontend, il peut effectuer des vérifications associées, par exemple déterminer si l'utilisateur a des problèmes. Le montant du paiement est-il correct, etc. ? Après avoir vérifié qu'il n'y a pas de problème et que vous pouvez demander un paiement au serveur WeChat, le backend doit utiliser le format de données spécifié par WeChat pour demander l'interface d'ordre de paiement unifiée de WeChat.

Après avoir traité toutes les données, organisez les données au format XML et envoyez-les à l'interface de commande unifiée de paiement WeChat en utilisant la méthode POST

3. le serveur WeChat

Une fois que le serveur WeChat a reçu les données de paiement, s'il n'y a pas de problème avec les données, il renverra les données correspondantes pour le paiement. Le plus important est le champ de données nommé prepay_id, qui doit être restitué Front-end, le front-end peut continuer à payer.

Par conséquent, une fois que le back-end a reçu les données de retour du serveur WeChat, il doit effectuer le traitement correspondant et enfin renvoyer les données au front-end. L'interface de paiement back-end a terminé la réception du front-end. -demande de paiement finale et a renvoyé l'interface de paiement frontale Fonctions qui nécessitent des données.

4. Le front-end initie le paiement

Après avoir reçu les données de retour, le front-end utilise wx.requestPayment() pour demander l'initiation du paiement. Les valeurs des paramètres d'objet requis par cette API sont les données renvoyées à l'étape précédente.

5. Le backend accepte le rappel du serveur WeChat

Une fois le paiement effectué par le frontend, le serveur WeChat confirme que le paiement a été effectué. Une notification sera envoyée à l'adresse de rappel définie lors de la première étape. Après avoir reçu la notification, l'interface de rappel de réception principale peut déterminer si le paiement est effectué et déterminer les actions ultérieures.

Une fois le paiement confirmé, le serveur WeChat déterminera si le paiement a réussi en fonction du champ de notification result_code. Après avoir reçu la notification réussie, le backend doit renvoyer les données de réussite au serveur WeChat pour informer le serveur WeChat qu'une notification de rappel a été reçue pour terminer le processus de paiement. Sinon, le serveur WeChat continuera d'envoyer des messages au backend.

Après comparaison, on constate qu'en fait, le paiement dans le mini programme est beaucoup plus facile que le paiement avec le compte officiel, car il n'est pas nécessaire de payer pour l'annuaire autorisé, et il n'est pas nécessaire de autorisez le nom de domaine, mais le processus de paiement est une étape de plus que le compte officiel, c'est-à-dire que la commande unifiée est prépayée, puis le résultat prépayé doit être à nouveau signé avant que le paiement puisse être initié.

Le code complet est le suivant :

//小程序端代码:
pay:function(){
var that=this
wx.getStorage({
key: 'openid',
success: function(res) {
wx.request({
//这里是后台的处理方法,url是自定义的,直接换成你自己的后台处理方法即可,Wx_Pay这个方法在下面写的有
//后台用的php做处理,java的可以参考方法,道理都是一样的
url: url + 'Wx_Pay',
data: {
//用户的openid
openid:res.data,
fee: that.data.totalPrice, //支付金额
details: that.data.goodsList[0].goods_name,//支付商品的名称
},
success:function(result){
if(result.data){
//out_trade_no=res.data['out_trade_no'];
wx.requestPayment({
timeStamp: result.data['timeStamp'],
nonceStr: result.data['nonceStr'],
package: result.data['package'],
signType: 'MD5',
paySign: result.data['paySign'],
'success':function(successret){
console.log('支付成功');
//获取支付用户的信息
wx.getStorage({
key: 'userInfo',
success: function (getuser) {
//加入订单表做记录
wx.request({
url: url + 'Wx_AddOrder',
data: {
uname: getuser.data.nickName,
goods: that.data.goodsList[0].goods_name,
price: that.data.totalPrice,
openid:res.data,
},
success: function (lastreturn) {
console.log("存取成功");
}
})
},
})
},'fail':function(res){
}
})
}
}
})
},
})
},
//后台
//微信支付
    public function Wx_Pay(){
        $request=Request::instance();
        $fee=$request->param('fee');
        $details=$request->param('details');//商品的详情,比如iPhone8,紫色
       // $fee = 0.01;//举例充值0.01
        $appid =        'appid';//appid
        $body =        $details;// '金邦汇商城';//'【自己填写】'
        $mch_id =       '1486742092';//'你的商户号【自己填写】'
        $nonce_str =    $this->nonce_str();//随机字符串
        $notify_url =   'https://zys.jinbh.cn/admin/Api/Wx_Speech';//回调的url【自己填写】';
        $openid =       $request->param('openid');//'用户的openid【自己填写】';
        $out_trade_no = $this->order_number($openid);//商户订单号
        $spbill_create_ip = '123.206.45.131';//'服务器的ip【自己填写】';
        $total_fee =    $fee*100;//因为充值金额最小是1 而且单位为分 如果是充值1元所以这里需要*100
        $trade_type = 'JSAPI';//交易类型 默认
        //这里是按照顺序的 因为下面的签名是按照顺序 排序错误 肯定出错
        $post['appid'] = $appid;
        $post['body'] = $body;
        
        $post['mch_id'] = $mch_id;
      
        $post['nonce_str'] = $nonce_str;//随机字符串
      
        $post['notify_url'] = $notify_url;
      
        $post['openid'] = $openid;
      
        $post['out_trade_no'] = $out_trade_no;
      
        $post['spbill_create_ip'] = $spbill_create_ip;//终端的ip
      
        $post['total_fee'] = $total_fee;//总金额 最低为一块钱 必须是整数
     
        $post['trade_type'] = $trade_type;
        $sign = $this->sign($post);//签名
        $post_xml = &#39;<xml>
           <appid>&#39;.$appid.&#39;</appid>
           <body>&#39;.$body.&#39;</body>
           <mch_id>&#39;.$mch_id.&#39;</mch_id>
           <nonce_str>&#39;.$nonce_str.&#39;</nonce_str>
           <notify_url>&#39;.$notify_url.&#39;</notify_url>
           <openid>&#39;.$openid.&#39;</openid>
           <out_trade_no>&#39;.$out_trade_no.&#39;</out_trade_no>
           <spbill_create_ip>&#39;.$spbill_create_ip.&#39;</spbill_create_ip>
           <total_fee>&#39;.$total_fee.&#39;</total_fee>
           <trade_type>&#39;.$trade_type.&#39;</trade_type>
           <sign>&#39;.$sign.&#39;</sign>
        </xml> &#39;;
        //统一接口prepay_id
        $url = &#39;https://api.mch.weixin.qq.com/pay/unifiedorder&#39;;
        $xml = $this->http_request($url,$post_xml);
        $array = $this->xml($xml);//全要大写
        if($array[&#39;RETURN_CODE&#39;] == &#39;SUCCESS&#39; && $array[&#39;RESULT_CODE&#39;] == &#39;SUCCESS&#39;){
            $time = time();
            $tmp=&#39;&#39;;//临时数组用于签名
            $tmp[&#39;appId&#39;] = $appid;
            $tmp[&#39;nonceStr&#39;] = $nonce_str;
            $tmp[&#39;package&#39;] = &#39;prepay_id=&#39;.$array[&#39;PREPAY_ID&#39;];
            $tmp[&#39;signType&#39;] = &#39;MD5&#39;;
            $tmp[&#39;timeStamp&#39;] = "$time";
            $data[&#39;state&#39;] = 1;
            $data[&#39;timeStamp&#39;] = "$time";//时间戳
            $data[&#39;nonceStr&#39;] = $nonce_str;//随机字符串
            $data[&#39;signType&#39;] = &#39;MD5&#39;;//签名算法,暂支持 MD5
            $data[&#39;package&#39;] = &#39;prepay_id=&#39;.$array[&#39;PREPAY_ID&#39;];//统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*
            $data[&#39;paySign&#39;] = $this->sign($tmp);//签名,具体签名方案参见微信公众号支付帮助文档;
            $data[&#39;out_trade_no&#39;] = $out_trade_no;
        }else{
            $data[&#39;state&#39;] = 0;
            $data[&#39;text&#39;] = "错误";
            $data[&#39;RETURN_CODE&#39;] = $array[&#39;RETURN_CODE&#39;];
            $data[&#39;RETURN_MSG&#39;] = $array[&#39;RETURN_MSG&#39;];
        }
      echo json_encode($data);
    }
//随机32位字符串
    private function nonce_str(){
        $result = &#39;&#39;;
        $str = &#39;QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz&#39;;
        for ($i=0;$i<32;$i++){
            $result .= $str[rand(0,48)];
        }
        return $result;
    }
//生成订单号
    private function order_number($openid){
        //date(&#39;Ymd&#39;,time()).time().rand(10,99);//18位
        return md5($openid.time().rand(10,99));//32位
    }
//签名 $data要先排好顺序
    public function sign($data)
    {
        $stringA = &#39;&#39;;
        foreach ($data as $key => $value) {
            if (!$value) continue;
            if ($stringA) $stringA .= &#39;&&#39; . $key . "=" . $value;
            else $stringA = $key . "=" . $value;
        }
        $wx_key = &#39;Zhangyusheng19810318015729366660&#39;;//申请支付后有给予一个商户账号和密码,登陆后自己设置key
        $stringSignTemp = $stringA . &#39;&key=&#39; . $wx_key;//申请支付后有给予一个商户账号和密码,登陆后自己设置key 
      return strtoupper(md5($stringSignTemp));
    }
//curl请求啊
        function http_request($url, $data = null, $headers = array())
        {
            $curl = curl_init();
            if (count($headers) >= 1) {
                curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            }
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            if (!empty($data)) {
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($curl);
            curl_close($curl);
            return $output;
        }
//获取xml
        private function xml($xml){
            $p = xml_parser_create();
            xml_parse_into_struct($p, $xml, $vals, $index);
            xml_parser_free($p);
            $data = "";
            foreach ($index as $key=>$value) {
                if($key == &#39;xml&#39; || $key == &#39;XML&#39;) continue;
                $tag = $vals[$value[0]][&#39;tag&#39;];
                $value = $vals[$value[0]][&#39;value&#39;];
                $data[$tag] = $value;
            }
            return $data;
        }
//微信支付结束
Copier après la connexion

Si vous souhaitez en savoir plus sur la programmation, veuillez faire attention à la formation php colonne !

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!