大家好,这篇文章是继微信支付之Native 扫码支付 模式一之后的微信支付系列教程第三篇:扫码支付之模式二

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

demo下载地址:https://github.com/1290800466/mac_win/tree/master/weixin_pay/%E5%85%AC%E4%BC%97%E8%B4%A6%E5%8F%B7%E6%94%AF%E4%BB%98DEMO/wx2

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

接下来是Public下的文件:

以上跟Native扫码模式一一样,不明白请看

  1. http://www.thinkphp.cn/code/1322.html
复制代码

jsAPI支付请看:

  1. http://www.thinkphp.cn/code/1321.html
复制代码

接下来直接看控制器部分的代码:
step1:同样,先初始化引入WxPayPubHelper类库

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

step2:这里就跟扫码支付模式一有区别了:根据订单生产二维码,使用统一支付接口,请看代码:

  1. public function createQrcode()
  2. {
  3. //使用统一支付接口
  4. $unifiedOrder = new \UnifiedOrder_pub();
  5. //设置统一支付接口参数
  6. //设置必填参数
  7. //appid已填,商户无需重复填写
  8. //mch_id已填,商户无需重复填写
  9. //noncestr已填,商户无需重复填写
  10. //spbill_create_ip已填,商户无需重复填写
  11. //sign已填,商户无需重复填写
  12. $unifiedOrder->setParameter("body","贡献一分钱");//商品描述
  13. //自定义订单号,此处仅作举例
  14. $timeStamp = time();
  15. $out_trade_no = C('WxPayConf_pub.APPID')."$timeStamp";
  16. $unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号
  17. $unifiedOrder->setParameter("total_fee","1");//总金额
  18. $unifiedOrder->setParameter("notify_url", C('WxPayConf_pub.NOTIFY_URL'));//通知地址
  19. $unifiedOrder->setParameter("trade_type","NATIVE");//交易类型
  20. //非必填参数,商户可根据实际情况选填
  21. //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
  22. //$unifiedOrder->setParameter("device_info","XXXX");//设备号
  23. //$unifiedOrder->setParameter("attach","XXXX");//附加数据
  24. //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
  25. //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
  26. //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
  27. //$unifiedOrder->setParameter("openid","XXXX");//用户标识
  28. //$unifiedOrder->setParameter("product_id","XXXX");//商品ID
  29. //获取统一支付接口结果
  30. $unifiedOrderResult = $unifiedOrder->getResult();
  31. //商户根据实际情况设置相应的处理流程
  32. if ($unifiedOrderResult["return_code"] == "FAIL")
  33. {
  34. //商户自行增加处理流程
  35. echo "通信出错:".$unifiedOrderResult['return_msg']."<br>";
  36. }
  37. elseif($unifiedOrderResult["result_code"] == "FAIL")
  38. {
  39. //商户自行增加处理流程
  40. echo "错误代码:".$unifiedOrderResult['err_code']."<br>";
  41. echo "错误代码描述:".$unifiedOrderResult['err_code_des']."<br>";
  42. }
  43. elseif($unifiedOrderResult["code_url"] != NULL)
  44. {
  45. //从统一支付接口获取到code_url
  46. $code_url = $unifiedOrderResult["code_url"];
  47. //商户自行增加处理流程
  48. //......
  49. }
  50. $this->assign('out_trade_no',$out_trade_no);
  51. $this->assign('code_url',$code_url);
  52. $this->assign('unifiedOrderResult',$unifiedOrderResult);
  53. $this->display('qrcode');
  54. }
复制代码

对应qrcode.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. </div>
  10. <div align="center">
  11. <p>订单号:<?php echo $out_trade_no; ?></p>
  12. </div>
  13. <div align="center">
  14. <form  action="./order_query.php" method="post">
  15. <input name="out_trade_no" type='hidden' value="<?php echo $out_trade_no; ?>">
  16. <button type="submit" >查询订单状态</button>
  17. </form>
  18. </div>
  19. <br>
  20. <div align="center">
  21. <form  action="./refund.php" method="post">
  22. <input name="out_trade_no" type='hidden' value="<?php echo $out_trade_no; ?>">
  23. <input name="refund_fee" type='hidden' value="1">
  24. <button type="submit" >申请退款</button>
  25. </form>
  26. </div>
  27. <br>
  28. <div align="center">
  29. <a href="../index.php">返回首页</a>
  30. </div>
  31. </body>
  32. <script src="__PUBLIC__/js/qrcode.js"></script>
  33. <script>
  34. if(<?php echo $unifiedOrderResult["code_url"] != NULL; ?>)
  35. {
  36. var url = "<?php echo $code_url;?>";
  37. //参数1表示图像大小,取值范围1-10;参数2表示质量,取值范围'L','M','Q','H'
  38. var qr = qrcode(10, 'M');
  39. qr.addData(url);
  40. qr.make();
  41. var wording=document.createElement('p');
  42. wording.innerHTML = "扫我,扫我";
  43. var code=document.createElement('DIV');
  44. code.innerHTML = qr.createImgTag();
  45. var element=document.getElementById("qrcode");
  46. element.appendChild(wording);
  47. element.appendChild(code);
  48. }
  49. </script>
  50. </html>
复制代码

模式二不需要配置公众平台了,所以简单就简单在这里

step3:异步通知,这里都一样:

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

这样模式二的扫码支付就OK了 是不是相对来说简单很多?

下面是测试截图:
扫码截图:

扫码结果:

有问题请留言,下面还会介绍微信支付刷卡支付的详细教程

ThinkPHP整合微信支付之Native 扫码支付 模式二相关推荐

  1. ThinkPHP整合微信支付之Native 扫码支付 模式一

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

  2. thinkphp3.2 微信 Native扫码支付功能

    Native 扫码支付之模式二 (模式一好像是不再支持了) 准备工作 认证过的服务号  商户号  业务域名 WxPay.Config.php 目录下面的这个文件记得要配置appid 这些 注意: 扫码 ...

  3. Java 微信native扫码支付 亲测有用

    最近在网上总结了spring cloud 微信扫码支付的流程, 本人是刚入行的小白,有不对的地方请大家指出 也欢迎大家来多多交流 我的商户APPID和秘钥的一些配置信息,是公司的 这些需要微信的商户认 ...

  4. 微信和支付宝H5扫码支付开发记录

    微信和支付宝H5扫码支付开发记录 微信支付 支付宝支付 简单前端实现的一下方法,服务端方法未记录: 微信支付 微信流程步骤简介 1.获取用户code 2.拉起微信支付 支付宝支付 支付宝流程步骤简介: ...

  5. 微信pc Native支付 支付宝pc扫码支付 Demo PHP tp5

    官方sdk Demo 支付宝 请求支付代码 public function alipay(){$arr =input('param.');vendor('alipay-trade-page-pay/a ...

  6. 微信支付开发(2) 扫码支付模式一

    关键字:微信支付 微信支付v3 native支付 扫码支付模式一 统一支付 Native支付 prepay_id  作者:方倍工作室 原文: http://www.cnblogs.com/txw195 ...

  7. 亲身经历之微信支付沙箱环境扫码支付遇到的那些坑

    很多用户在调用微信支付扫码支付沙箱环境都一脸迷茫,废话不多说,遇到很多坑,为了让大家少走弯路下面直接说说我开发微信支付遇到坑,微信沙箱不是一般的坑,是很大的坑. 1.首先下载的官方demo,不能直接用 ...

  8. 对支付宝微信们来说,扫码支付限额 500 元新规意味着什么?

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 12月27日下午,据中国人民银行(下称央行)网站消息,将于近日发布关于印发<条码支付业 ...

  9. 商户接入微信支付方法(扫码支付、刷卡、app)

    微信支付的几种方式解读: 微信支付商户平台的付款方式有以下几种: 公众号支付:在微信内的商家页面上完成公众号支付 APP支付:在APP中,调起微信进行APP支付 扫码支付:扫描二维码(包含PC网站)进 ...

最新文章

  1. 【转载】zookeeper学习
  2. java将字符串和字符串数组互相转换方法
  3. 建站需要mysql_你还在对建站数据不重视吗-Navicat for MySQL赶快上手使用吧
  4. 递归调用方法时栈内存是如何变化的?(使用内存图演示递归调用过程)
  5. JavaScript中的嵌套事件处理(在鼠标移动事件上)
  6. 北京师大网络教育计算机离线作一,2015北师大网络教育《计算机应用基础》离线作业2精选.doc...
  7. 滚动文字Marquee属性及参数设置
  8. linux系统安装本地r包,linux环境下安装R包DESeq2的报错以及解决方法
  9. eweishop 人人商城区别_微擎开发之人人商城添加第三方支付系列
  10. nodejs 实现 磁力链接资源搜索 BT磁力链接爬虫
  11. 三阶段最小二乘法 回归分析 3SLS python实现
  12. ZoomIt 屏幕放大 缩小 屏幕画笔 演示 手写笔迹 倒计时 秒变白板 pointofix
  13. 第一章 爬虫(认识网络爬虫)
  14. Word文档怎样修改纸张的方向?分享方法!word文档如何更改纸张的方向?
  15. 菜鸟带你使用JieCaoMediaPlayer播放本地视频
  16. python 计算月还款额度
  17. WITH AS 用法 (说实话,WITH AS还真是简单)
  18. 【视觉定位UV】CCD相机安装标准
  19. HTML虚拟键盘带声音特效
  20. 熬夜爆肝!C++基础入门大合集【万字干货预警 建议收藏】

热门文章

  1. 正则表达式 bs4解析 xpath解析
  2. gun c语言教程,(转)GUN make指南
  3. AI测试,当下有为未来可期:业界第一本AI测试秘籍重磅发布
  4. [V5] ARM: dts: Change i2s compatible string on exynos5250【转】
  5. Autofs或nfs挂载后,目录内无法编辑或创建,权限问题
  6. Python基础第十六天:面向对象进阶
  7. 上海博达高速网吧运营级接入方案(转)
  8. 仿微信聊天-时间间隔五分钟
  9. 【计算机网络】异步传输与同步传输
  10. Java中的条件语句