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

    php实现微信以及小程序扫码支付的代码

    不言不言2018-09-11 14:30:57原创1473
    本篇文章给大家带来的内容是关于php实现微信以及小程序扫码支付的代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    <?php //微信支付
    
    /**
    
     * 适用于微信所有支付, 扫码支付 小程序支付   二维码的需要接入生成二维码的代码,这个可以共用
    
    *    xml 根据文档自行删改, 共用微信统一下单dome 
    
     */    
    class Payapi
    {
    
            统一下单
          public function Pay($orderid,$total_fee){   参数是订单号 加金额,  可以改动, 
              $fee = $total_fee;//举例充值0.01
              $appid ='';//如果是公众号 就是公众号的appid
              $body = '名字';
              $mch_id ='商户号';
              $nonce_str = $this->nonce_str();//随机字符串
              $notify_url ='回调地址';
              $out_trade_no = $orderid;//商户订单号
              $spbill_create_ip = '主机ip';
              $total_fee = $fee*100;//因为充值金额最小是1 而且单位为分 如果是充值1元所以这里需要*100
              $trade_type = 'NATIVE';//交易类型 默认
    
    
              //这里是按照顺序的 因为下面的签名是按照顺序 排序错误 肯定出错
              $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> ';
              //统一接口prepay_id
              $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
              $xml = $this->http_request($url,$post_xml);
              $array = $this->xml($xml);//全要大写
              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'] = 1;
                  $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;
                   $data['CODE_URL']  =$array['CODE_URL'];
              }else{
                  $data['state'] = 0;
                  $data['text'] = "错误";
                  $data['RETURN_CODE'] = $array['RETURN_CODE'];
                  $data['RETURN_MSG'] = $array['RETURN_MSG'];
              }
            return  json_encode($data);
    
          }
    
    
    
    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){
          ksort($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;//申请支付后有给予一个商户账号和密码,登陆后自己设置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 == 'xml' || $key == 'XML') continue;
                  $tag = $vals[$value[0]]['tag'];
                  $value = $vals[$value[0]]['value'];
                  $data[$tag] = $value;
              }
              return $data;
          }
    
    }

    相关推荐:

    微信扫红码 微信支付扫码支付php版

    PHP实现微信扫码支付功能

    以上就是php实现微信以及小程序扫码支付的代码的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:微信支付dome
    上一篇:php如何使用QueryList轻松采集js动态渲染页面? 下一篇:php用static方法的原因介绍(代码示例)
    线上培训班

    相关文章推荐

    • PHP如何配置• 分享常见的几种页面静态化的方法_php基础• PHP查询附近的人及其距离的实现方法• php使用curl并发减少后端访问时间的方法分析• PHP编程入门的基本语法知识点总结_php基础

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网