• 技术文章 >后端开发 >php教程

    微信小程序支付功能用php进行后台对接

    不言不言2018-06-13 09:29:57原创915
    这篇文章主要为大家详细介绍了微信小程序支付功能,分享了php后台对接完整代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    微信小程序支付,php后台对接完整代码,全是干货呀,拿过来可以直接使用。小程序在调起微信支付之前需要5个参数,这时候就需要携带code向后台请求,然后后台根据code获取openid 再进行服务器之间的。

    一、准备工作

    1、小程序注册,要以公司的以身份去注册一个小程序,才有微信支付权限;

    2、绑定商户号。

    3、在小程序填写合法域

    二、完成以上条件,你可以得到

    小程序appid 小程序秘钥 这两个用于获取用户openid;

    商户号id ,商户号秘钥 支付接口必须的;

    三、开始开发

    前台代码

     /* 
     调起微信支付 
     @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); 
      } 
      }) 
     } 
     }); 
     
     
     } 
     }) 
     
    }

    以下是PHP后台代码 ,这里用的是tp框架

    <?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['HTTP_RAW_POST_DATA']; 
     $WxPayData = new \WxPayDataBase(); 
     $result = $WxPayData->FromXml($xml); 
     if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){ 
      //回调逻辑处理。。。 
      
      
      //返回给微信的参数 
      $data['RETURN_CODE'] = 'SUCCESS'; 
      $data['RETURN_MSG'] = 'OK'; 
     
     
     }else{ 
      $data['RETURN_CODE'] = 'FAIL'; 
      $data['RETURN_MSG'] = 'NO'; 
     } 
     //返回给微信 
     $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 ''; 
     }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 = '';//appid 
      $WX_SECRET = '';//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 = '';//appid 
     $body =  '标题'; 
     $mch_id = ''; //商户号 
     $nonce_str = $this->nonce_str();//随机字符串 
     $notify_url = ''; //回调的url【自己填写】 
     $openid = $openid; 
     $out_trade_no = $this->order_number();//商户订单号 
     $spbill_create_ip = '';//服务器的ip【自己填写】; 
     $total_fee = $fee*100;//这里需要*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 = '<xml> 
      <appid>'.$appid.'</appid> 
      <body>'.$body.'</body> 
      <mch_id>'.$mch_id.'</mch_id> 
      <nonce_str>'.$nonce_str.'</nonce_str> 
      <notify_url>'.$notify_url.'</notify_url> 
      <openid>'.$openid.'</openid> 
      <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> '; 
     
     
     //print_r($post_xml);die; 
     //统一接口prepay_id 
     $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; 
     $xml = $this->http_request($url,$post_xml); 
     
     $array = $this->xml($xml);//全要大写 
     
     
     //print_r($array); 
     if($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS'){ 
     $time = time(); 
     $tmp='';//临时数组用于签名 
     $tmp['appId'] = $appid; 
     $tmp['nonceStr'] = $nonce_str; 
     $tmp['package'] = 'prepay_id='.$array['PREPAY_ID']; 
     $tmp['signType'] = 'MD5'; 
     $tmp['timeStamp'] = "$time"; 
     
     
     $data['state'] = 200; 
     $data['timeStamp'] = "$time";//时间戳 
     $data['nonceStr'] = $nonce_str;//随机字符串 
     $data['signType'] = 'MD5';//签名算法,暂支持 MD5 
     $data['package'] = 'prepay_id='.$array['PREPAY_ID'];//统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=* 
     $data['paySign'] = $this->sign($tmp);//签名,具体签名方案参见微信公众号支付帮助文档; 
     $data['out_trade_no'] = $out_trade_no; 
     
     
     }else{ 
     $data['state'] = 0; 
     $data['text'] = "错误"; 
     $data['RETURN_CODE'] = $array['RETURN_CODE']; 
     $data['RETURN_MSG'] = $array['RETURN_MSG']; 
     } 
     
     
     echo json_encode($data); 
    } 
    
     
    //随机32位字符串 
    private function nonce_str(){ 
     $result = ''; 
     $str = 'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz'; 
     for ($i=0;$i<32;$i++){ 
     $result .= $str[rand(0,48)]; 
     } 
     return $result; 
    } 
     
     
    //生成订单号 
    private function order_number($openid){ 
     //date('Ymd',time()).time().rand(10,99);//18位 
     return md5($openid.time().rand(10,99));//32位 
    } 
     
     
    //签名 $data要先排好顺序 
    private function sign($data){ 
     $stringA = ''; 
     foreach ($data as $key=>$value){ 
     if(!$value) continue; 
     if($stringA) $stringA .= '&'.$key."=".$value; 
     else $stringA = $key."=".$value; 
     } 
     $wx_key = '';//申请支付后有给予一个商户账号和密码,登陆后自己设置的key 
     $stringSignTemp = $stringA.'&key='.$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 == 'xml' || $key == 'XML') continue; 
     $tag = $vals[$value[0]]['tag']; 
     $value = $vals[$value[0]]['value']; 
     $data[$tag] = $value; 
     } 
     return $data; 
    } 
     
    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

    相关推荐:

    在php中用html_entity_decode实现HTML实体转义

    以上就是微信小程序支付功能用php进行后台对接的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:微信小程序 支付
    上一篇:使用Laravel框架的Seeder实现自动填充数据功能 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 浅析PHP应用程序中正确调用系统命令的方法• 求解:phpcms模板怎样转码?该怎么解决• 想请问一下印证的有关问题• php 之 cookie 跟 session 简单解读(笔记) • xml转换成数组的有关问题
    1/1

    PHP中文网