Heim  >  Artikel  >  WeChat-Applet  >  So implementieren Sie die Zahlungsfunktion eines Miniprogramms

So implementieren Sie die Zahlungsfunktion eines Miniprogramms

coldplay.xixi
coldplay.xixiOriginal
2020-08-31 10:41:0613156Durchsuche

Die Methode zum Implementieren der Zahlungsfunktion des Miniprogramms: Stellen Sie zunächst eine Zahlungsanforderung im Front-End und fordern Sie den WeChat-Server im Back-End an Das Front-End leitet die Zahlung ein und schließlich akzeptiert das Back-End den Rückruf des WeChat-Servers. 🔜 Vorne- Beenden Sie die Zahlungsanforderung, das heißt Tragen Sie einfach die für die Zahlung erforderlichen Daten wie Benutzer-ID, Zahlungsbetrag, Zahlungsauftrags-ID usw. ein. Relevante Daten im Zusammenhang mit Ihrer Geschäftslogik oder die Daten, die für den nächsten Schritt der Zahlungsanforderung an den WeChat-Server erforderlich sind Verwenden Sie für die einheitliche Bestellschnittstelle** WeChat. Das Miniprogramm wx.request() fordert die Back-End-Zahlungsschnittstelle an.

2. Das Backend fordert den WeChat-Server an So implementieren Sie die Zahlungsfunktion eines Miniprogramms

Nachdem das Backend die vom Frontend gesendete Zahlungsanforderung erhalten hat, kann es entsprechende Überprüfungen durchführen, z. B. feststellen, ob Probleme mit dem Benutzer vorliegen und ob der Zahlungsbetrag korrekt ist , usw. Nachdem sichergestellt wurde, dass kein Problem vorliegt und Sie eine Zahlung beim WeChat-Server beantragen können, muss das Backend das von WeChat angegebene Datenformat verwenden, um die einheitliche Zahlungsauftragsschnittstelle von WeChat anzufordern. Nachdem alle Daten verarbeitet wurden, organisieren Sie die Daten im XML-Format und senden Sie sie mithilfe der POST-Methode an die einheitliche Bestellschnittstelle von WeChat. 3 Das Backend akzeptiert die vom WeChat-Server zurückgegebenen Daten. Der WeChat-Server empfängt Wenn es kein Problem mit den Daten gibt, werden die entsprechenden Daten zur Zahlung zurückgegeben. Das wichtigste ist das Datenfeld mit dem Namen prepay_id. Diese Daten müssen an das Frontend zurückgegeben werden weiterhin zahlen.

Daher muss das Back-End, nachdem es die Rückgabedaten vom WeChat-Server empfangen hat, eine entsprechende Verarbeitung durchführen und die Daten schließlich an das Front-End zurücksenden. Die Back-End-Zahlungsschnittstelle hat die Funktion des Front-End-Empfangs abgeschlossen. Zahlungsaufforderung beenden und die für die Front-End-Zahlung erforderlichen Daten zurücksenden.

4. Das Frontend leitet die Zahlung ein

Nach Erhalt der Rücksendedaten fordert das Frontend mit wx.requestPayment() die Zahlungsauslösung an. Die von dieser API benötigten Werte der Objektparameter sind die im vorherigen Schritt zurückgegebenen Daten.

5. Das Backend akzeptiert Rückrufe vom WeChat-Serverwx.request( ) 去请求后端的支付接口。

2. 后端请求微信服务器

后端接收到前端发送的支付请求后,可以进行一下相关验证,例如判断一下用户有没有问题,支付金额对不对等等。在验证没什么问题,可以向微信服务器申请支付之后,后端需要使用微信规定的数据格式 去请求微信的支付统一下单接口。

在处理好所有数据后,将这些数据以 XML 格式整理并以 POST 方法发送到微信支付统一下单接口

3.后端接受微信服务器返回数据

微信服务器在接收到支付数据之后,如果数据没有问题,其会返回用于支付的相应数据,其中非常重要的是 名称为 prepay_id 的数据字段,需要将此数据返回前端,前端才能继续支付。

因此,在后端接收到微信服务器的返回数据后,需要进行相应的处理,最终返回到前端数据,后端的支付接口已经完成了接收前端支付请求,并返回了前端支付所需数据的功能。

4. 前端发起支付

前端在接收到返回数据后,使用 wx.requestPayment()来请求发起支付。此 API 需要的对象参数各项值就是我们上一步返回的各个数据。

5.后端接受微信服务器回调

前端完成支付后,微信服务器确认支付已经完成。就会向第一步中设置的回调地址发送通知。后端的接收回调接口在接收到通知后,就可以判断支付是否完成,从而决定后续动作。

确认支付后,微信服务器会根据通知result_code

Nachdem das Frontend die Zahlung abgeschlossen hat, bestätigt der WeChat-Server, dass die Zahlung abgeschlossen ist. Es wird eine Benachrichtigung an die im ersten Schritt festgelegte Rückrufadresse gesendet. Nach Erhalt der Benachrichtigung kann die Back-End-Empfangsrückrufschnittstelle feststellen, ob die Zahlung abgeschlossen ist, und weitere Aktionen festlegen.

Nach der Bestätigung der Zahlung ermittelt der WeChat-Server anhand des Benachrichtigungsfelds result_code, ob die Zahlung erfolgreich war. Nach Erhalt der erfolgreichen Benachrichtigung muss das Backend Erfolgsdaten an den WeChat-Server zurücksenden, um den WeChat-Server darüber zu informieren, dass eine Rückrufbenachrichtigung zum Abschluss des Zahlungsvorgangs eingegangen ist. Andernfalls sendet der WeChat-Server weiterhin Nachrichten an das Backend. Nach dem Vergleich können wir feststellen, dass die Zahlung im Miniprogramm tatsächlich viel einfacher ist als die Zahlung mit dem offiziellen Konto, da keine Zahlung für das autorisierte Verzeichnis und keine Autorisierung des Domainnamens erforderlich ist. Der Zahlungsvorgang umfasst jedoch einen weiteren Schritt als das offizielle Konto, nämlich die einheitliche Bestellung. Es handelt sich um eine Vorauszahlung, und dann muss das Ergebnis der Vorauszahlung erneut unterschrieben werden, bevor die Zahlung eingeleitet werden kann.

Der vollständige Code lautet wie folgt:

//小程序端代码:
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;
        }
//微信支付结束

Wenn Sie mehr über das Programmieren erfahren möchten, achten Sie bitte auf die Spalte
php-Schulung🎜! 🎜🎜🎜

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Zahlungsfunktion eines Miniprogramms. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn