Erlo

vue+thinkphp5实现微信扫码支付(NATIVE支付)

2024-07-02 12:29:26 发布   31 浏览  
页面报错/反馈
收藏 点赞

前言

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中NATIVE的支付实现流程与PC端实现扫码支付流程

流程实现(后端)(PHP)

  1. 创建Wechatpay.php文件,放到指定文件目录下(我是放到了extend目录)
 $v)
          {
              if($k != "sign"){
                  $buff .= $k . "=" . $v . "&";
              }
          }

          $buff = trim($buff, "&");
          return $buff;
      }


      //数组转XML
      function arrayToXml($arr)
      {
          $xml = "";
          foreach ($arr as $key=>$val)
          {   if (is_numeric($val)){
                  $xml.="".$val."".$key.">";
              }else{
                  $xml.="".$key.">";
                  
              }
            
          }
          $xml.="";
          return $xml;
      }

      //将XML转为array
      function xmlToArray($xml)
      {
          //禁止引用外部xml实体
          libxml_disable_entity_loader(true);
          $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
          return $values;
      }

      /**
       * 获取随机字符串
       * @return mixed
       */
      function getRandString($len=12,$str='ABCDEFGHIJKLMNOPQRSTUVWYXZabcdefghijklmnopqrstuvwyxz1234567890'){
          $strlen=strlen($str)-1;
          $string='';
          for ($i=0; $i 

2.定义公共变量

private $config = array(
        'appid' => "wxa******",    /*微信小程序的appid*/
        'appid_app' => "wx******",    /*微信开放平台上的应用id*/
        'mch_id' => "*******",   /*微信申请成功之后邮件中的商户id*/
        'api_key' => "*************",    /*在微信商户平台上自己设定的api密钥 32位*/
        'notify_url' => 'https://***',  /*支付回调地址,确保可以访问*/
    );

3.支付接口

public function NativePay($id,$price,$body,$type,$attach){
        
            Loader::import('wechatpay.Wechatpay', EXTEND_PATH,".php");
            $wechatpay = new Wechatpay();
            $url='https://api.mch.weixin.qq.com/pay/unifiedorder';
            $orderID='XXX'.time().rand(0,9).rand(0,9).rand(0,9);
            $parameters=array(
                'appid'=>$this->config["appid"],//appID
                'mch_id'=>$this->config['mch_id'],//商户号
                'nonce_str'=>$wechatpay->getRandString(30),//随机字符串
                'body'=>$body,//商品描述
                'out_trade_no'=>$orderID,//商户订单号
                'total_fee'=>$price*100,//总金额 单位 分 
                'spbill_create_ip'=>$this->get_client_ip(),//终端IP
                'notify_url'=>$this->config["notify_url"],//通知地址
                'trade_type'=>'NATIVE',//交易类型
                'attach'=>$attach
            );
            //参数名ASCII码从小到大排序
            ksort($parameters);
            //统一下单签名
            $String = $wechatpay->ToUrlParams($parameters);
            //签名步骤二:在string后加入KEY
            $String = $String."&key=".$this->config['api_key']; // key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
            //签名步骤三:MD5加密
            $parameters['sign']=strtoupper(md5($String));
            $xmlData=$wechatpay->arrayToXml($parameters);
            $return=$wechatpay->xmlToArray($wechatpay->curl_https($url,$xmlData));
            if($return["return_code"]=="SUCCESS" && $return["result_code"]=="SUCCESS"){
                //生成订单或其他逻辑
                //返回二维码链接给前端
                $returnData=[
                    'code_url'=>$return["code_url"],
                    'orderID'=>$orderID
                ];
                // echo $this->creatqrcode($return["code_url"]);
                $this->result($returnData,'1','支付二维码生成成功!','json');
            }else{
                echo json_encode(array("status"=>false,"msg"=>$return));
            }
       

    }

    /*
    获取当前服务器的IP
    */
    public function get_client_ip(){
        if ($_SERVER['REMOTE_ADDR']) {
            $cip = $_SERVER['REMOTE_ADDR'];
        } elseif (getenv("REMOTE_ADDR")) {
            $cip = getenv("REMOTE_ADDR");
        } elseif (getenv("HTTP_CLIENT_IP")) {
            $cip = getenv("HTTP_CLIENT_IP");
        } else {
            $cip = "unknown";
        }
        return $cip;
    }
  1. 支付回调
//微信支付回调接口
    public function wxpaynotify(){
        $xml = file_get_contents('php://input');
        Loader::import('wechatpay.Wechatpay', EXTEND_PATH,".php");
        $wechatpay = new Wechatpay();
        //将服务器返回的XML数据转化为数组
        $data = $wechatpay->xmlToArray($xml);
        // 保存微信服务器返回的签名sign
        $data_sign = $data['sign'];
        // sign不参与签名算法
        unset($data['sign']);
        $sign = $wechatpay->ToUrlParams($data);
        $payData=$sign;
        $sign=strtoupper(md5($sign."&key=".$this->config["api_key"]));
        // 判断签名是否正确  判断支付状态
        if ( ($sign===$data_sign) && ($data['result_code']=='SUCCESS') ) {
            
            // 更新消费订单状态等操作
            
            $result = true;
        }else{
            file_put_contents('payResult.tex','验签失败!');
            $result = false;
        }
        // 返回状态给微信服务器
        if ($result) {
            $str='';
        }else{
            $str='';
        }
        echo $str;

    }

流程实现(前端)(Vue)






//导入二维码组件QRCode
import QRCode from 'qrcode';

let qrcodeUrl = res.data.code_url
const canvas = this.$refs.qrcode
QRCode.toCanvas(canvas, qrcodeUrl, function (error) {
    if (error) console.error(error)
    console.log('QR code generated successfully.')
})

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认