最近在写微信扫码支付(模式一),特此记录一下开发过程中的问题。

一、二维码生成:

1.1、二维码所需参数列表:

1.2、生成二维码内容链接,如下:

weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX

1.3、生成二维码:

使用qrcode类库,将1.2中生成的二维码链接转换为二维码(qrcode的使用请自行百度)。

二、设置回调地址:

进入商户平台–>产品中心–>开发配置,进行配置和修改,如下图:

注:回调地址要保证外网可以访问

三、API秘钥设置:

进入商户平台–>账户中心–>API安全,进行配置和修改,如下图:

说明:
3.1、秘钥必须为加密后的32位字符串,可以使用md5,随便写的32位字符,一般设置不会成功;
3.2、秘钥设置后,一定要显示秘钥生成时间才表示秘钥已经生效(如图中所示)。此处比较坑,我第一次设置秘钥提示成功,但不显示秘钥生成时间,结果扫码后一直提示URL原生参数错误

四、请求过程:

说明:请求过程需要做两次签名认证,分别为:
调用统一下单接口时,重新生成签名;
返回prepay_id给微信支付系统时,重新生成签名。

4.1、获取支付系统返回的参数

使用
file_get_contents("php://input");
或者 $GLOBALS['HTTP_RAW_POST_DATA'];      //此时要在php.ini中开启always_populate_raw_post_data = On

得到返回的XML数据,如下图:

4.2、调用统一下单接口:

说明:在统一下单接口中,需要根据请求参数,重新生成sign签名,不要使用生成二维码时的签名

/**设置随机字符串**/
public function getNonceStr($length = 32)
{$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";$str ="";for ( $i = 0; $i < $length; $i++ )  {$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);}return $str;}/**设置订单号**/
public function outTradeNo(){return date('YmdHis'). rand(100000,999999);
}/**设置curl请求**/
public  function postXmlCurl($xml, $url, $second = 30){$ch = curl_init();//设置超时curl_setopt($ch, CURLOPT_TIMEOUT, $second);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验//设置headercurl_setopt($ch, CURLOPT_HEADER, FALSE);//要求结果为字符串且输出到屏幕上curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//post提交方式curl_setopt($ch, CURLOPT_POST, TRUE);curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);curl_setopt($ch, CURLOPT_TIMEOUT, 40);set_time_limit(0);//运行curl$data = curl_exec($ch);//返回结果if ($data) {curl_close($ch);return $data;} else {$error = curl_errno($ch);curl_close($ch);return 'error';}}/**设置sign签名**/
public function SetSign($values)
{//按字典排序参数,并判断排序是否成功if(ksort($values)){//排序后拼接字符串$string = '';foreach($values as $k=>$v){if(isset($v) && !empty($v)){$string .= $k . "=" . $v . "&";}}$stringA = trim($string,"&");//拼接key,得到stringSignTemp$stringSignTemp = $stringA."&key=".$this->key;$signValue = strtoupper(md5($stringSignTemp));$this->values['sign'] = $signValue;return $signValue;}
}/*数组转XML*/
public function arrToXml($arr){//判断数组是否为空if(empty($arr) || !is_array($arr)){return '';    //暂时返回空}$xml  =  '<xml>';//数组转XMLforeach($arr as $k=>$v){if (is_numeric($v)){$xml.="<".$k.">".$v."</".$k.">";}else{$xml.="<".$k."><![CDATA[".$v."]]></".$k.">";}}$xml .= '<xml/>';return $xml;
}/*XML转数组*/
private function xmlToArr($xml){$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);return $array_data;
}

得到统一下单XML参数,如下图所示:

4.3、获取prepay_id 参数:

获取统一下单接口返回参数如下:

4.4、将prepay_id 返回给微信支付系统:

说明:
1、在返回prepay_id时,需要根据请求参数,重新生成sign签名,不要使用统一下单中生成的签名;
2、此处生成签名使用的随机字符串,要使用统一下单接口返回的随机字符串,不要使用自己生成的随机字符串
返回参数如下图所示:


至此,扫码支付模式一完成。
如有不足欢迎指正!!!

五、常见错误:
5.1、
错误一:扫描二维码,提示原生URL参数错误:
解决方法:
a、首先验证sign签名是否正确,使用官方校验工具;
b、查看API秘钥是否设置成功。
5.2、
错误二:扫描二维码,提示系统繁忙:
解决方法:此错误多数是sign签名错误,检查签名。

微信扫码支付(模式一)详解相关推荐

  1. 微信扫码支付模式二【无法回调】解决方案

    微信扫码支付模式二[无法回调]解决方案 参考文章: (1)微信扫码支付模式二[无法回调]解决方案 (2)https://www.cnblogs.com/lhat/p/5611242.html 备忘一下 ...

  2. JAVA微信扫码支付模式二功能实现完整例子

    概述 本例子实现微信扫码支付模式二的支付功能,应用场景是,web网站微信扫码支付.实现从点击付费按钮.到弹出二维码.到用户用手机微信扫码支付.到手机上用户付费成功.web网页再自动调整到支付成功后的页 ...

  3. 微信扫码支付模式二【无法回调】解决方案(转)

    微信扫码支付模式二[无法回调]解决方案(转) 参考文章: (1)微信扫码支付模式二[无法回调]解决方案(转) (2)https://www.cnblogs.com/kenshinobiy/p/8724 ...

  4. 微信扫码支付模式一提示系统繁忙

    微信扫码支付模式一提示系统繁忙,很纳闷 解决方法: 扫了二维码后执行统一下单后响应给微信支付系统的参数如下 String prepay_id = (String)resp.get("prep ...

  5. 随手记录JAVA微信扫码支付模式二功能

    概述 本例子实现微信扫码支付模式二的支付功能,应用场景是,web网站微信扫码支付.实现从点击付费按钮.到弹出二维码.到用户用手机微信扫码支付.到手机上用户付费成功.web网页再自动调整到支付成功后的页 ...

  6. 微信 扫码支付模式二 开发

    概要 主要记录自己的开发流程,使用的springMVC 支付流程 引入相关依赖 <!-- 微信支付 --> <dependency><groupId>com.git ...

  7. 微信扫码支付---模式一(PC端,解决中文乱码)

    近期公司调完银联,调支付宝,调完支付宝调微信.说实话微信的帮助文档确实是烂,而且有没有技术支持,害的我头发都掉了一桌.不说废话了,看代码. 首先登陆微信的公众平台(微信的服务号不是订阅号),然后选择微 ...

  8. 微信扫码支付dome php,帝国cms 微信扫码支付 模式二 扫码付款demo

    [实例简介] 到处没找到帝国扫码支付的插件,找到的都是收费的.所以自己随便改了个扫码支付,官方DEMO改的.功能都已实现.支付测试扫码的都没问题.后台支付记录也能正常添加 [实例截图] [核心代码] ...

  9. php微信支付使用ajax,微信扫码支付模式二支付状态Ajax轮询实例

    Ajax 轮训支付状态代码: //设置每隔1000毫秒执行一次load() 方法 setInterval(function(){load()},1000); function load(){ var ...

  10. 微信支付ajax实现支付,微信扫码支付模式二支付状态Ajax轮询实例

    Ajax 轮训支付状态代码: //设置每隔1000毫秒执行一次load() 方法 setInterval(function(){load()},1000); function load(){ var ...

最新文章

  1. GIT入门笔记(4)- GIT 安装
  2. c语言图形界面设定,「分享」C语言如何编写图形界面
  3. Kubernetes — Flannel CNI
  4. UIView 学习知识点
  5. 7.01面试长沙黄花机场
  6. iOS手势操作简介(五)
  7. CSS clip:rect矩形剪裁功能
  8. 社会管理网格化 源码_为什么说网格化管理是基层社会治理的有效武器
  9. Java ByteArrayInputStream reset()方法及示例
  10. mp3排序软件哪个好用_U盘加密软件_U盘防拷贝软件哪个好用?
  11. 华为牛人在华为工作十年的感悟!--总结[华为的10年工作]
  12. Bailian4042 Rabin-Karp字符串匹配【文本】
  13. MySQL数据库(7)_MySQL 数据备份与还原
  14. 轻松自动化---selenium-webdriver(python) (十一)
  15. 程序员常用的这十个电子书下载网站,你值得拥有!
  16. louvain算法 matlab,Community_BGLL_Matlab 复杂网络社团发现算法Louvain的 版本,简单实用,欢迎下载 272万源代码下载- www.pudn.com...
  17. html表格制作实战
  18. 一文看懂韦恩图和欧拉图的不同
  19. 三 机器人仿真软件Gazebo介绍
  20. 【Cesium】加载互联网地图服务——高德地图

热门文章

  1. c#小数百分数格式化
  2. 与专业人士沟通工作,这4句话千万不能说
  3. java写入写出文件的原理_Java文件断点续传实现原理解析
  4. 计算机管理进行分区,如何硬盘分区_怎么硬盘分区-win7之家
  5. STM32F103ZET6 — TIM6/TIM7
  6. mahout如何使用随机森林测试数据集
  7. 基于STM32的VEML6040颜色传感器应用
  8. 惠租车葡萄牙租车攻略
  9. (转)4步实现DD-WRT贝尔金7231脱机BT
  10. 【NIO】学习系列(二)ByteBuffer类