Heim  >  Artikel  >  Backend-Entwicklung  >  Die Zahlungsfunktion des WeChat-Miniprogramms verwendet PHP für das Backend-Docking

Die Zahlungsfunktion des WeChat-Miniprogramms verwendet PHP für das Backend-Docking

不言
不言Original
2018-06-13 09:29:571572Durchsuche

Dieser Artikel stellt hauptsächlich die Zahlungsfunktion des WeChat Mini-Programms im Detail vor und teilt den vollständigen Code des PHP-Backend-Dockings. Interessierte Freunde können sich auf

WeChat Mini-Programmzahlung, PHP-Backend beziehen Durch das Andocken des vollständigen Codes können Sie alle nützlichen Informationen direkt verwenden. Das Miniprogramm erfordert 5 Parameter, bevor es WeChat Pay aufruft. Zu diesem Zeitpunkt müssen Sie den Code zum Anfordern des Hintergrunds übertragen. Anschließend erhält der Hintergrund die OpenID basierend auf dem Code und führt dann die Kommunikation zwischen den Servern durch.

1. Vorbereitung

1. Sie müssen ein Miniprogramm als Unternehmen registrieren

2. Verknüpfen Sie die Händlernummer.

3. Füllen Sie den rechtlichen Bereich im Miniprogramm aus

2. Nachdem Sie die oben genannten Bedingungen erfüllt haben, können Sie

Mini-Programm-App-ID. Mini-Programm-Geheimschlüssel. Diese beiden werden verwendet, um die Benutzer-OpenID zu erhalten.

Händlernummer-ID, Händler-Nummer-Geheimschlüssel. Erforderlich für die Zahlungsschnittstelle >

3. Starten Sie die Entwicklung

Front-End-Code

 /* 
 调起微信支付 
 @param 支付价格,不填写默认为1分钱 
*/ 
function pay(total_fee) { 
 
 var total_fee = total_fee; 
 wx.login({ 
 success: res => { 
 
 //code 用于获取openID的条件之一 
 var code = res.code; 
 wx.request({ 
 url: '后台地址/index.php', 
 method: "POST", 
 data: { 
  total_fee:total_fee, 
  code: code, 
 }, 
 header: { 
  'content-type': 'application/x-www-form-urlencoded' // 默认值 
 }, 
 success: function (res) { //后端返回的数据 
  var data = res.data; 
  console.log(data); 
  console.log(data["timeStamp"]); 
  wx.requestPayment({ 
  timeStamp: data['timeStamp'], 
  nonceStr: data['nonceStr'], 
  package: data['package'], 
  signType: data['signType'], 
  paySign: data['paySign'], 
  success: function (res) { 
  wx.showModal({ 
  title: '支付成功', 
  content: '', 
  }) 
  }, 
  fail: function (res) { 
  console.log(res); 
  } 
  }) 
 } 
 }); 
 
 
 } 
 }) 
 
}

Das Folgende ist der PHP-Back- Endcode, hier wird das TP-Framework verwendet

<?php 
namespace Home\Controller; 
use Think\Controller; 
class PayController extends Controller { 
 
 /** 
 * [callback 微信支付回调处理] 
 * @Author zhengmingzhou 
 * @DateTime 2018-05-22 
 * @return function [description] 
 */ 
 public function callback(){ 
 vendor("Wechart.WxPay.Api"); 
 vendor("Wechart.NativePay"); 
 vendor("Wechart.WxPay.Data"); 
 vendor("Wechart.WxPay.Notify"); 
 
 
 //获取微信返回支付信息 
 $xml = $GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;]; 
 $WxPayData = new \WxPayDataBase(); 
 $result = $WxPayData->FromXml($xml); 
 if($result[&#39;return_code&#39;] == &#39;SUCCESS&#39; && $result[&#39;result_code&#39;] == &#39;SUCCESS&#39;){ 
  //回调逻辑处理。。。 
  
  
  //返回给微信的参数 
  $data[&#39;RETURN_CODE&#39;] = &#39;SUCCESS&#39;; 
  $data[&#39;RETURN_MSG&#39;] = &#39;OK&#39;; 
 
 
 }else{ 
  $data[&#39;RETURN_CODE&#39;] = &#39;FAIL&#39;; 
  $data[&#39;RETURN_MSG&#39;] = &#39;NO&#39;; 
 } 
 //返回给微信 
 $xml = self::arrtoxml($data); 
 echo $xml; 
 } 
 
 /** 
 * [arrtoxml 格式化返回给微信的数据格式] 
 * @Author zhengmingzhou 
 * @DateTime 2018-05-22 
 * @param [type] $arr [description] 
 * @return [type]  [description] 
 */ 
 private function arrtoxml( $arr ){ 
 if(!$arr){ 
  return &#39;&#39;; 
 }else{ 
  $xml = "<xml>"; 
  foreach ($arr as $key=>$val) 
  { 
  if (is_numeric($val)){ 
   $xml.="<".$key.">".$val."</".$key.">"; 
  }else{ 
   $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; 
  } 
  } 
  $xml.="</xml>"; 
  return $xml; 
 } 
 } 
 
//微信支付 
public function pay(){ 
 //获取openid 
 if(I("post.code")) 
 { //用code获取openid 
  $code=I("post.code"); 
  $WX_APPID = &#39;&#39;;//appid 
  $WX_SECRET = &#39;&#39;;//AppSecret 
  $url = "https://api.weixin.qq.com/sns/jscode2session?appid=" . $WX_APPID . "&secret=" . $WX_SECRET . "&js_code=" . $code . "&grant_type=authorization_code"; 
  $infos = json_decode(file_get_contents($url)); 
  $openid = $infos->openid; 
 } 
 if(I("post.total_fee")) 
 { 
  $total_fee=I("post.total_fee"); 
 } 
 else 
 { 
  $total_fee=0.01; 
 } 
 
 $fee = 0.01;//举例充值0.01 
 $appid = &#39;&#39;;//appid 
 $body =  &#39;标题&#39;; 
 $mch_id = &#39;&#39;; //商户号 
 $nonce_str = $this->nonce_str();//随机字符串 
 $notify_url = &#39;&#39;; //回调的url【自己填写】 
 $openid = $openid; 
 $out_trade_no = $this->order_number();//商户订单号 
 $spbill_create_ip = &#39;&#39;;//服务器的ip【自己填写】; 
 $total_fee = $fee*100;//这里需要*100 
 $trade_type = &#39;JSAPI&#39;;//交易类型 默认 
 
 
 //这里是按照顺序的 因为下面的签名是按照顺序 排序错误 肯定出错 
 $post[&#39;appid&#39;] = $appid; 
 $post[&#39;body&#39;] = $body; 
 $post[&#39;mch_id&#39;] = $mch_id; 
 $post[&#39;nonce_str&#39;] = $nonce_str;//随机字符串 
 $post[&#39;notify_url&#39;] = $notify_url; 
 $post[&#39;openid&#39;] = $openid; 
 $post[&#39;out_trade_no&#39;] = $out_trade_no; 
 $post[&#39;spbill_create_ip&#39;] = $spbill_create_ip;//终端的ip 
 $post[&#39;total_fee&#39;] = $total_fee;//总金额 
 $post[&#39;trade_type&#39;] = $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;; 
 
 
 //print_r($post_xml);die; 
 //统一接口prepay_id 
 $url = &#39;https://api.mch.weixin.qq.com/pay/unifiedorder&#39;; 
 $xml = $this->http_request($url,$post_xml); 
 
 $array = $this->xml($xml);//全要大写 
 
 
 //print_r($array); 
 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;] = 200; 
 $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要先排好顺序 
private 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;&#39;;//申请支付后有给予一个商户账号和密码,登陆后自己设置的key 
 $stringSignTemp = $stringA.&#39;&key=&#39;.$wx_key; 
 return strtoupper(md5($stringSignTemp)); 
} 
 
 
//curl请求 
public 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; 
} 
 
}

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website!

Verwandte Empfehlungen:

Verwenden Sie html_entity_decode, um HTML-Entity-Escape in PHP zu implementieren

Das obige ist der detaillierte Inhalt vonDie Zahlungsfunktion des WeChat-Miniprogramms verwendet PHP für das Backend-Docking. 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