当前位置:首页 > CMS教程 > Thinkphp > 列表

ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-16 09:58:23 浏览: 评论:0 

这篇文章主要介绍了ThinkPHP框架整合微信支付之Native 扫码支付模式一,结合图文形式详细分析了thinkPHP整合微信支付接口的扫码支付功能相关操作步骤、实现技巧与注意事项,需要的朋友可以参考下。

本文实例讲述了ThinkPHP框架整合微信支付之Native 扫码支付模式一。分享给大家供大家参考,具体如下:

大家好,这篇文章是继微信支付jsapi篇之后的微信支付系列教程第二篇:扫码支付之模式一介绍下扫码支付目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程,微信开发文档都有详细介绍,这里就不多说废话,接下来赶紧上教程!

首先我们还是一样,导入微信支付的类库:

ThinkPHP微信支付 Native

接下来是Public下的文件:

ThinkPHP微信支付 Native

这里的配置跟JSAPI支付一样,不需要改动

接下来直接看控制器部分的代码:

step1:同样,先初始化引入WxPayPubHelper类库

  1. /** 
  2.      * 初始化 
  3.      */ 
  4.     public function _initialize() 
  5.     { 
  6.         //引入WxPayPubHelper 
  7.         vendor('WxPayPubHelper.WxPayPubHelper'); 
  8.     } 

step2:展示扫码页面需要先生存二维码链接

  1. public function native_pay() 
  2.     { 
  3.         //设置静态链接 
  4.         $nativeLink = new \NativeLink_pub(); 
  5.           
  6.         //设置静态链接参数 
  7.         //设置必填参数 
  8.         //appid已填,商户无需重复填写 
  9.         //mch_id已填,商户无需重复填写 
  10.         //noncestr已填,商户无需重复填写 
  11.         //time_stamp已填,商户无需重复填写 
  12.         //sign已填,商户无需重复填写 
  13.         $product_id = C('WxPayConf_pub.APPID')."static";//自定义商品id 
  14.         $nativeLink->setParameter("product_id",$product_id);//商品id 
  15.         //获取链接 
  16.         $product_url = $nativeLink->getUrl(); 
  17.         //使用短链接转换接口 
  18.         $shortUrl = new \ShortUrl_pub(); 
  19.         //设置必填参数 
  20.         //appid已填,商户无需重复填写 
  21.         //mch_id已填,商户无需重复填写 
  22.         //noncestr已填,商户无需重复填写 
  23.         //sign已填,商户无需重复填写 
  24.         $shortUrl->setParameter("long_url",$product_url);//URL链接 
  25.         //获取短链接 
  26.         $codeUrl = $shortUrl->getShortUrl(); 
  27.         $this->assign('product_url',$product_url); 
  28.         $this->assign('codeUrl',$codeUrl); 
  29.         $this->display(); 
  30.           
  31.     } 

以上代码对应native_pay.html页面

  1. <!DOCTYPE HTML> 
  2. <html> 
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>微信安全支付</title> 
  6. </head> 
  7. <body> 
  8.     <div align="center" id="qrcode"
  9.         <p >扫我,扫我</p> 
  10.     </div> 
  11.     <div align="center"
  12.         <a href="#" rel="external nofollow" >返回首页</a> 
  13.     </div> 
  14. </body> 
  15.     <script src="__PUBLIC__/js/qrcode.js"></script> 
  16.     <script> 
  17.         var url = "<?php echo $product_url;?>"
  18.         //参数1表示图像大小,取值范围1-10;参数2表示质量,取值范围'L','M','Q','H' 
  19.         var qr = qrcode(10, 'M'); 
  20.         qr.addData(url); 
  21.         qr.make(); 
  22.         var dom=document.createElement('DIV'); 
  23.         dom.innerHTML = qr.createImgTag(); 
  24.         var element=document.getElementById("qrcode"); 
  25.         element.appendChild(dom); 
  26.     </script> 
  27. </html> 

这里注意生存二维码的js地址,我放在了Public下的JS目录下

step3:扫码之后,就会提交给我们公众平台native配置的地址对应的去方法处理公众平台navtive配置:配置地址 http://您的域名/Pay/index.php/Home/WxNative/todoPost

ThinkPHP微信支付 Native

对应的todoPost方法在控制器中:

  1. public function todoPost() 
  2.     { 
  3.         //以log文件形式记录回调信息,用于调试 
  4.         $log_name = __ROOT__."/Public/native_call.log"
  5.         //使用native通知接口 
  6.         $nativeCall = new \NativeCall_pub(); 
  7.           
  8.         //接收微信请求 
  9.         $xml = $GLOBALS['HTTP_RAW_POST_DATA']; 
  10.         log_result($log_name,"【接收到的native通知】:\n".$xml."\n"); 
  11.         $nativeCall->saveData($xml); 
  12.           
  13.         if($nativeCall->checkSign() == FALSE){ 
  14.             $nativeCall->setReturnParameter("return_code","FAIL");//返回状态码 
  15.             $nativeCall->setReturnParameter("return_msg","签名失败");//返回信息 
  16.         } 
  17.         else 
  18.         { 
  19.             //提取product_id 
  20.             $product_id = $nativeCall->getProductId(); 
  21.           
  22.             //使用统一支付接口 
  23.             $unifiedOrder = new \UnifiedOrder_pub(); 
  24.           
  25.             //根据不同的$product_id设定对应的下单参数,此处只举例一种 
  26.             switch ($product_id
  27.             { 
  28.                   
  29.                 case C('WxPayConf_pub.APPID')."static"://与native_call_qrcode.php中的静态链接二维码对应 
  30.                     //设置统一支付接口参数 
  31.                     //设置必填参数 
  32.                     //appid已填,商户无需重复填写 
  33.                     //mch_id已填,商户无需重复填写 
  34.                     //noncestr已填,商户无需重复填写 
  35.                     //spbill_create_ip已填,商户无需重复填写 
  36.                     //sign已填,商户无需重复填写 
  37.                     $unifiedOrder->setParameter("body","贡献一分钱");//商品描述 
  38.                     //自定义订单号,此处仅作举例 
  39.                     $timeStamp = time(); 
  40.                     $out_trade_no = C('WxPayConf_pub.APPID').$timeStamp
  41.                     $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商户订单号             $unifiedOrder->setParameter("product_id","$product_id");//商品ID 
  42.                     $unifiedOrder->setParameter("total_fee","1");//总金额 
  43.                     $unifiedOrder->setParameter("notify_url",C('WxPayConf_pub.NOTIFY_URL'));//通知地址 
  44.                     $unifiedOrder->setParameter("trade_type","NATIVE");//交易类型 
  45.                     $unifiedOrder->setParameter("product_id",$product_id);//用户标识 
  46.                     //非必填参数,商户可根据实际情况选填 
  47.                     //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号 
  48.                     //$unifiedOrder->setParameter("device_info","XXXX");//设备号 
  49.                     //$unifiedOrder->setParameter("attach","XXXX");//附加数据 
  50.                     //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间 
  51.                     //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间 
  52.                     //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记 
  53.                     //$unifiedOrder->setParameter("openid","XXXX");//用户标识 
  54.           
  55.                     //获取prepay_id 
  56.                     $prepay_id = $unifiedOrder->getPrepayId(); 
  57.                     //设置返回码 
  58.                     //设置必填参数 
  59.                     //appid已填,商户无需重复填写 
  60.                     //mch_id已填,商户无需重复填写 
  61.                     //noncestr已填,商户无需重复填写 
  62.                     //sign已填,商户无需重复填写 
  63.                     $nativeCall->setReturnParameter("return_code","SUCCESS");//返回状态码 
  64.                     $nativeCall->setReturnParameter("result_code","SUCCESS");//业务结果 
  65.                     $nativeCall->setReturnParameter("prepay_id",$prepay_id);//预支付ID 
  66.           
  67.                     break
  68.                 default
  69.                     //设置返回码 
  70.                     //设置必填参数 
  71.                     //appid已填,商户无需重复填写 
  72.                     //mch_id已填,商户无需重复填写 
  73.                     //noncestr已填,商户无需重复填写 
  74.                     //sign已填,商户无需重复填写 
  75.                     $nativeCall->setReturnParameter("return_code","SUCCESS");//返回状态码 
  76.                     $nativeCall->setReturnParameter("result_code","FAIL");//业务结果 
  77.                     $nativeCall->setReturnParameter("err_code_des","此商品无效");//业务结果 
  78.                     break
  79.             } 
  80.           
  81.         } 
  82.           
  83.         //将结果返回微信 
  84.         $returnXml = $nativeCall->returnXml(); 
  85.         log_result($log_name,"【返回微信的native响应】:\n".$returnXml."\n"); 
  86.  
  87.         echo $returnXml
  88.     } 

其实到这里你已经完成了扫码支付模式一的功能

step4:接下来写一下异步通知处理,与jsapi支付一样:

  1. public function notify() 
  2.     { 
  3.         //使用通用通知接口 
  4.         $notify = new \Notify_pub(); 
  5.            
  6.         //存储微信的回调 
  7.         $xml = $GLOBALS['HTTP_RAW_POST_DATA']; 
  8.         $notify->saveData($xml); 
  9.            
  10.         //验证签名,并回应微信。 
  11.         //对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败, 
  12.         //微信会通过一定的策略(如30分钟共8次)定期重新发起通知, 
  13.         //尽可能提高通知的成功率,但微信不保证通知最终能成功。 
  14.         if($notify->checkSign() == FALSE){ 
  15.             $notify->setReturnParameter("return_code","FAIL");//返回状态码 
  16.             $notify->setReturnParameter("return_msg","签名失败");//返回信息 
  17.         }else
  18.             $notify->setReturnParameter("return_code","SUCCESS");//设置返回码 
  19.         } 
  20.         $returnXml = $notify->returnXml(); 
  21.         echo $returnXml
  22.            
  23.         //==商户根据实际情况设置相应的处理流程,此处仅作举例======= 
  24.            
  25.         //以log文件形式记录回调信息 
  26.         //         $log_ = new Log_(); 
  27.         $log_name= __ROOT__."/Public/notify_url.log";//log文件路径 
  28.            
  29.         $this->log_result($log_name,"【接收到的notify通知】:\n".$xml."\n"); 
  30.            
  31.         if($notify->checkSign() == TRUE) 
  32.         { 
  33.             if ($notify->data["return_code"] == "FAIL") { 
  34.                 //此处应该更新一下订单状态,商户自行增删操作 
  35.                 log_result($log_name,"【通信出错】:\n".$xml."\n"); 
  36.             } 
  37.             elseif($notify->data["result_code"] == "FAIL"){ 
  38.                 //此处应该更新一下订单状态,商户自行增删操作 
  39.                 log_result($log_name,"【业务出错】:\n".$xml."\n"); 
  40.             } 
  41.             else
  42.                 //此处应该更新一下订单状态,商户自行增删操作 
  43.                 log_result($log_name,"【支付成功】:\n".$xml."\n"); 
  44.             } 
  45.                
  46.             //商户自行增加处理流程, 
  47.             //例如:更新订单状态 
  48.             //例如:数据库操作 
  49.             //例如:推送支付完成信息 
  50.         } 
  51.     } 

native扫码支付模式一demo到此就可以啦

下面展示下测试的截图:

扫码界面:

ThinkPHP微信支付 Native

扫码结果:

ThinkPHP微信支付 Native

Tags: ThinkPHP微信支付 Native

分享到: