ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pc端生成微信支付二维码

2022-02-10 16:31:03  阅读:269  来源: 互联网

标签:arr return addTrade no 微信 pc 二维码 params order


基础类WechatPay.php

<?php
namespace App\Library;

class WechatPay{

    const KEY = '2nlp59yio07cgmz6qk1rwtdbu34xa8sj'; //支付秘钥需要更改成自己的
    const APPID = 'wx3bf59e7749b9cb05'; //APPID需要更改为自己的
    const MCHID = '1617949930'; //商户号需要更改成自己的
    // const SECRET = 'b9840976e63916e233d1d380549514a3'; //开发者密码需要更改为自己的
    const UOURL = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; //无需更改 统一下单API地址
    // const NOTIFY = 'http://tpmapi.vfinemusic.com/fontend/pay/sendWechatNO';   //支付通知地址需要更改成你自己服务器的地址

    public function __construct() {
       
    }
    //获取签名
    public function getSign($arr){ 
        //去除数组的空值
        array_filter($arr);
        if(isset($arr['sign'])){
            unset($arr['sign']);
        }
        //排序
        ksort($arr);
        //组装字符
        $str = $this->arrToUrl($arr) . '&key=' . self::KEY;
        //使用md5 加密 转换成大写 
       return strtoupper(md5($str));
    }
    //获取带签名的数组
    public function setSign($arr){
        $arr['sign'] = $this->getSign($arr);
        return $arr;
    }
    //校验签名
    public function checkSign($arr){        
        //生成新签名
        $sign = $this->getSign($arr);
        //和数组中原始签名比较
        if($sign == $arr['sign']){
            return true;
        }else{
            return false;
        }
    }
    //数组转URL字符串 不带key
    public function arrToUrl($arr){
        return urldecode(http_build_query($arr));
    }
    //记录到文件
    public  function logs($file,$data){
        $data = is_array($data) ? print_r($data,true) : $data;
        file_put_contents('/www/paylog/' .$file, $data);
    }
    public function getPost(){
        return file_get_contents('php://input');
    }
    //Xml 文件转数组
    public function XmlToArr($xml)
    {    
        if($xml == '') return '';
        libxml_disable_entity_loader(true);
        $arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);        
        return $arr;
    }
    //数组转XML
    public function ArrToXml($arr)
    {
        if(!is_array($arr) || count($arr) == 0) return '';

        $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; 
    }
    //post 字符串到接口
    public function postStr($url,$postfields){
        $ch = curl_init();
        $params[CURLOPT_URL] = $url;    //请求url地址
        $params[CURLOPT_HEADER] = false; //是否返回响应头信息
        $params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
        $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
        $params[CURLOPT_POST] = true;
        $params[CURLOPT_SSL_VERIFYPEER] = false;//禁用证书校验
    $params[CURLOPT_SSL_VERIFYHOST] = false;
        $params[CURLOPT_POSTFIELDS] = $postfields;
        curl_setopt_array($ch, $params); //传入curl参数
        $content = curl_exec($ch); //执行
        curl_close($ch); //关闭连接
        return $content;
    }
    //统一下单
    public function unifiedorder($params){
        //获取到带签名的数组
        $params = $this->setSign($params);
        //数组转xml
        $xml = $this->ArrToXml($params);
        //发送数据到统一下单API地址
        $data = $this->postStr(self::UOURL, $xml);
        $arr = $this->XmlToArr($data);
        if($arr['return_code']=='FAIL'){
            $this->logs('wechatpayfail.txt','写入时间'.date('Y-m-d H:i:s',time()).$arr['return_msg']);
            return $arr;
        }
        if($arr['result_code'] == 'SUCCESS' && $arr['return_code'] == 'SUCCESS'){
            return $arr;
        }else{
            $this->logs('wechatpayfail.txt','写入时间'.date('Y-m-d H:i:s',time()).$arr['return_msg']);
            return $arr;
        }
    }

     //获取构建二维码的URL地址
    public function getQRurl(){
        $params = [
            'appid'             => self::APPID,
            'mch_id'            => self::MCHID,
            'product_id'    => 1,
            'time_stamp'    => time(),
            'nonce_str'     => md5(time()),
        ];
        
      return 'weixin://wxpay/bizpayurl?' . $this->arrToUrl($this->setSign($params));
    }
}
?>

项目中生成微信支付二维码接口

/*发起微信支付请求
    @author tjg
    @param string total_amount    订单金额
    @param string desc            订单描述
    @return json
   */
    public function sendWechatPay($param=''){

      if(!empty($param['total_amount'])){
        $total_fee=$param['total_amount'];
      }else{
        $total_fee=1;
      }
      if(!empty($param['desc'])){
          $body=$param['desc'];
        }else{
          $body='微信扫码支付模式二';
        }
      $notify_url=Env('APP_URL').'/fontend/pay/sendWechatNO';
      $order_no=$param['order_no'];//订单号
      $user_id=$param['user_id'];//用户id
      $order_money=$total_fee;//订单金额
      $attach=$order_no.','.$user_id.','.$order_money;
      $WechatPay=new WechatPay();
      $params = [
            'appid'             => config('auth.wechat.APPID'),
            'mch_id'            => config('auth.wechat.MCHID'),
            // 'product_id'  => $oid,
            // 'time_stamp'  => time(),
            'nonce_str'   => md5(time()),
            'body'=> $body,
            'out_trade_no'=> date('YmdHis'),
            'total_fee'=> $total_fee,
            'notify_url'=> Env('APP_URL').'/fontend/pay/sendWechatNO',
            'trade_type'=>'NATIVE',
            'attach'=>$attach,
        ];
      $arr = $WechatPay->unifiedorder($params);
      //判断支付结果
      if($arr['return_code']=='SUCCESS' && $arr['result_code']=='SUCCESS' && $arr['return_msg']=='OK'){
        $data['wechatpay_code']=$arr['code_url'];
        return json_encode(['code'=>0,'msg'=>'请求成功','data'=>$data]);
      }else{
        $data['wechatpay_code']='';
        return json_encode(['code'=>-1,'msg'=>$arr['return_msg'],'data'=>$data]);
      }
    }

/*微信支付异步回调地址
    @author tjg
    @return json
   */
    public function sendWechatNO($result=''){      
      $WechatPay=new WechatPay();
      $arr = $WechatPay->XmlToArr($result);
      if(!empty($arr)){
        $attach=$arr['attach'];
        $attach_arr=explode(',',$attach);
        $order_no=$attach_arr[0];
        $user_id=$attach_arr[1];
        $order_money=$attach_arr[2];
        //调用异步处理接口
        if($arr['result_code']=='SUCCESS' && $arr['return_code']=='SUCCESS'){
                $addTrade['trade_no']=$arr['out_trade_no'];
                $addTrade['pay_id']=1;
                $addTrade['subject']='购买商品';
                $addTrade['body']='购买商品';
                $addTrade['price']=$order_money;
                $addTrade['pay_amount']=$arr['total_fee'];
                $addTrade['receipt_amount']=$arr['total_fee'];
                $addTrade['trade_status']=1;
                $addTrade['pay_time']=date('Y-m-d H:i:s',time());
                $addTrade['create_at']=date('Y-m-d H:i:s',time());
                $addTrade['row_data']=$result;
                $addTrade['order_no']=$order_no;
                $findPayTrade=DB::table('info_pay_trade')->where(['order_no'=>$order_no])->first();
                if(empty($findPayTrade)){
                  DB::table('info_pay_trade')->insert($addTrade);
                }
                $file='wechatpaysuccess.txt';
                $strsuccess='异步回调写入时间'.date('Y-m-d H:i:s',time()).$result;
                $WechatPay->logs($file,$strsuccess);
                $pay_type='WX_PAY';
                $ret = OrderService::payFinished($order_no, $user_id,$order_money,$pay_type);
                echo "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";  
        }else{  
                $addTrade['trade_no']=$arr['out_trade_no'];
                $addTrade['pay_id']=1;
                $addTrade['subject']='购买商品';
                $addTrade['body']='购买商品';
                $addTrade['price']=$order_money;
                $addTrade['pay_amount']=$arr['total_fee'];
                $addTrade['receipt_amount']=$arr['total_fee'];
                $addTrade['trade_status']=2;
                $addTrade['pay_time']=date('Y-m-d H:i:s',time());
                $addTrade['create_at']=date('Y-m-d H:i:s',time());
                $addTrade['row_data']=$result;
                $addTrade['order_no']=$order_no;
                $findPayTrade=DB::table('info_pay_trade')->where(['order_no'=>$order_no])->first();
                if(empty($findPayTrade)){
                  DB::table('info_pay_trade')->insert($addTrade);
                }
                $file='wechatpayfail.txt';
                $strfail='异步回调写入时间'.date('Y-m-d H:i:s',time()).$result;
                $WechatPay->logs($file,$strfail);
                echo "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";  
        }
      }
    }

标签:arr,return,addTrade,no,微信,pc,二维码,params,order
来源: https://blog.csdn.net/tianjingang1/article/details/122863798

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有