>백엔드 개발 >PHP 튜토리얼 >WeChat 및 미니 프로그램 스캐닝 결제를 구현하는 PHP 코드

WeChat 및 미니 프로그램 스캐닝 결제를 구현하는 PHP 코드

不言
不言원래의
2018-09-11 14:30:572846검색

이 글의 내용은 위챗 구현을 위한 PHP 코드와 미니 프로그램 스캔 코드 결제에 관한 내용입니다. 도움이 필요한 친구들이 참고하시면 좋을 것 같습니다.

<?php //微信支付

/**

 * 适用于微信所有支付, 扫码支付 小程序支付   二维码的需要接入生成二维码的代码,这个可以共用

*    xml 根据文档自行删改, 共用微信统一下单dome 

 */    
class Payapi
{

        统一下单
      public function Pay($orderid,$total_fee){   参数是订单号 加金额,  可以改动, 
          $fee = $total_fee;//举例充值0.01
          $appid =&#39;&#39;;//如果是公众号 就是公众号的appid
          $body = &#39;名字&#39;;
          $mch_id =&#39;商户号&#39;;
          $nonce_str = $this->nonce_str();//随机字符串
          $notify_url =&#39;回调地址&#39;;
          $out_trade_no = $orderid;//商户订单号
          $spbill_create_ip = &#39;主机ip&#39;;
          $total_fee = $fee*100;//因为充值金额最小是1 而且单位为分 如果是充值1元所以这里需要*100
          $trade_type = &#39;NATIVE&#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;;
          //统一接口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;
               $data[&#39;CODE_URL&#39;]  =$array[&#39;CODE_URL&#39;];
          }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;];
          }
        return  json_encode($data);

      }



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){
      ksort($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;//申请支付后有给予一个商户账号和密码,登陆后自己设置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
      public 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;
      }

}

관련 추천:

WeChat 빨간색 코드 스캔 WeChat 결제 코드를 스캔하여 PHP 버전 결제

#🎜🎜 #

PHP는 WeChat 스캔 코드 결제 기능을 구현합니다

위 내용은 WeChat 및 미니 프로그램 스캐닝 결제를 구현하는 PHP 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

관련 기사

더보기