目录

1. 那一抹淡淡的忧伤—–微信开发基础
2. 用纯js是不可能用纯js了,这辈子都不用纯js了 —– 微信JSSDK开发以及问题解答
3. 要你命3000 —— 微信支付开发系列问题解决

导语

为什么要开发微信和微信开发的优势我就不用多说了吧。微信支付的方式分好几种:
1.扫码支付
2.公众号支付
3.APP支付
不管是那种支付方式,都要用到统一下单这个接口,而一般大多数人都会卡在预支付id没有拿到这一步,今天就主要分析预支付id的获取和问题解决

开发前准备

  • 一个开通了微信支付的公众号
  • 确保将安全授权目录配置好了
  • 支付回调地址配置好了

如果不知道怎么配置,请看这里


步骤一:发起支付准备

  1. 生成商户订单

    先要根据自己的业务逻辑生成自己可读的商户订单号,一般推荐年月日+随机数+用户uid

$order_no = date('YmdHis').rand(1000,9999).$uid;
  1. 使用同一下单接口下单

使用微信统一下单接口,获得微信的预支付信息,对于统一下单接口的详细信息可以看这里

第一步:
我们先实例化微信统一下单接口的类,这个类在微信支付V3demo里有,当然在这里我将微信demo类库再次封装加入命名空间更好的适应Thinkphp。

UnifiedOrder_pub类:

<?phpnamespace Org\Weixinpay;
use Org\Weixinpay\Wxpay_client_pub;
use Org\Weixinpay\WxPayConf_pub;
use Org\Weixinpay\SDKRuntimeException;
/*** 统一支付接口类*/class UnifiedOrder_pub extends Wxpay_client_pub{function __construct($appid,$mchid,$key,$appsecret){Common_util_pub::__construct($appid,$mchid,$key,$appsecret);//设置接口链接$this->url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//设置curl超时时间$this->curl_timeout = 60;}/*** 生成接口参数xml*/function createXml(){try{//检测必填参数if($this->parameters["out_trade_no"] == null){throw new SDKRuntimeException("缺少统一支付接口必填参数out_trade_no!"."<br>");}elseif($this->parameters["body"] == null){throw new SDKRuntimeException("缺少统一支付接口必填参数body!"."<br>");}elseif ($this->parameters["total_fee"] == null ) {throw new SDKRuntimeException("缺少统一支付接口必填参数total_fee!"."<br>");}elseif ($this->parameters["notify_url"] == null) {throw new SDKRuntimeException("缺少统一支付接口必填参数notify_url!"."<br>");}elseif ($this->parameters["trade_type"] == null) {throw new SDKRuntimeException("缺少统一支付接口必填参数trade_type!"."<br>");}elseif ($this->parameters["trade_type"] == "JSAPI" &&$this->parameters["openid"] == NULL){throw new SDKRuntimeException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"."<br>");}$this->parameters["appid"] = $this->appid;//公众账号ID$this->parameters["mch_id"] = $this->mchid;//商户号//$this->parameters["sub_mch_id"] = "1xxxxxxx2";//子商户号  $this->parameters["spbill_create_ip"] = get_client_ip();//终端ip$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串$this->parameters["sign"] = $this->getSign($this->parameters);//签名return  $this->arrayToXml($this->parameters);}catch (SDKRuntimeException $e){return array('return_code'=>'FAIL','return_msg'=>$e->errorMessage());}}/*** 获取prepay_id*/function getPrepayId(){$this->postXml();$this->result = $this->xmlToArray($this->response);return $this->result;}}

我们实例化UnifiedOrder_pub,并依此传入参数,$appid,$mchid,$key,$appsecret

//appid 商家appid
//mchid 商家商户号
//key  商家支付秘钥
//appsecret JSAPI获准码//调用统一下单$unifiedOrder = new UnifiedOrder_pub($this->config['pay_weixin_appid'],$this->config['pay_weixin_mchid'],$this->config['pay_weixin_key'],$this->config['pay_weixin_appsecret']);

waring:在第一步里面会出的错误就是你的四个参数没有按顺序给对,记住这里面的参数一定要按顺序给,并且你要检查你的四个参数是否是有效的没有过期
在第一步出错的同学都不能吊起微信支付的样式,即下图:

但是如果你写入了调试js的话可以看见具体错误,这里就不提调试js了。

第二步:向统一下单接口中添加所需参数

        $unifiedOrder->setParameter("openid",$this->user_info['openid']);//用户微信唯一标识$unifiedOrder->setParameter("body",$this->order_info['order_name']);//商品描述$unifiedOrder->setParameter("out_trade_no",$order_no);//商户订单号$unifiedOrder->setParameter("total_fee",floatval($pay_money*100));//总金额$unifiedOrder->setParameter("notify_url",$notice_url);//通知地址$unifiedOrder->setParameter("trade_type","JSAPI");//交易类型

warning: 在第二步中,尤其要注意的就这个通知地址的格式,通知地址一定不能带任何参数的地址,包括你是pathinfo模式也好,只能以www.xxxxx.com/index.php这种模式结尾。
www.xxx.com/index.php?a=index,www.xxx.com/index.php/admin/index 这样的写法全部是错的。

第三步:获取预支付信息

将上述内容提交给接口,正确可返回预支付ID

$prepay_result = $unifiedOrder->getPrepayId();

如果错误,我们可以打印来查看是什么错误

var_dump($prepay_result);
$prepay_result['return_code'] == 'FAIL'//标志支付失败
$prepay_result['return_msg']//这个角标中有具体错误信息打印看看!
//缺少统一支付接口必填参数out_trade_no!
//缺少统一支付接口必填参数body
//缺少统一支付接口必填参数total_fee!
//缺少统一支付接口必填参数notify_url!
//...等等一些的错误提示,大家可以打印出来看看,然后对照着修改

当我们已经拿到预支付ID的时候,那么支付准备已经完成


调起JSAPI支付

第一步:在前台文件中我们使用注册支付JSAPI

//调起支付必备参数准备
function onBridgeReady(msg_json){WeixinJSBridge.invoke('getBrandWCPayRequest', {"appId":msg_json.appId,     //公众号名称,由商户传入"timeStamp":msg_json.timeStamp,         //时间戳,自1970年以来的秒数"nonceStr":msg_json.nonceStr, //随机串"package":msg_json.package,"signType":msg_json.signType,         //微信签名方式:"paySign":msg_json.paySign //微信签名},function(res){// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。if(res.err_msg == "get_brand_wcpay_request:ok" ) {check_pay_is_ture_ok();  //检测微信支付状态}else{}});}

第二步:支付js准备绑定事件(这里就举例按钮)

$('#button_pay_now').on('click',function(){if (typeof WeixinJSBridge == "undefined"){if( document.addEventListener ){document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);}else if (document.attachEvent){document.attachEvent('WeixinJSBridgeReady', onBridgeReady);document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);}}else{onBridgeReady(msg_json);}});

到这里我们就可以看到调起微信支付的JS效果了


报错信息分析

微信坑就在你很好的完成以上步骤也不能支付,总会报错,在这里我就把我曾经遇到的错误写下来,与大家一起探讨

1.缺少统一支付接口必填参数total_fee!
这个错造成的原因:
q:你没有传递参数total_fee a:检查是否传递参数,最好一步步打印到日志中查看
q:total_fee 参数格式错误 a:参数的单位是分,也就是一元钱的话就是100,所以建议最后处理的时候都要处理为分,建议最后用floatval处理下

2.缺少统一支付接口必填参数notify_url!
这个错造成的原因:
q:你没有传递参数notify_url a:检查是否传递参数,最好一步步打印到日志中查看
q:notify_url 参数格式错误 a:通知地址一定不能带任何参数的地址,包括你是pathinfo模式也好,只能以www.xxxxx.com/index.php这种模式结尾

3.签名错误
这个错造成的原因:
1.你的四个参数的错误,尤其注意key这个参数,如果你的key是大小写混合的话,一定要在签名前把其转化为统一的大写形式
2.签名中的APPID 和appsecret
appid和商户号
不匹配

3.过期的key,可以支付的公众号可是要一年过期一次,相应的key每年都会有变化。

【坑爹微信】微信支付相关问题解决相关推荐

  1. 微信App支付相关问题

    微信App支付相关问题 Q1:调起微信支付页面时,一闪而过,在屏幕上方有弹窗 首先检查调用request.checkArgs(),检查参数.当返回true时,还是出现上述状况,就检查签名.注意参与签名 ...

  2. app 访问h5 如何截取_微信H5支付申请相关问题

    之前的文章「微信支付申请相关问题」里说过微信公众号和 APP 申请微信支付,今天来说下微信 H5 支付的申请. 背景介绍 H5 支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认 ...

  3. 申请微信支付相关事宜

    申请微信支付相关事宜   一.所需信息或材料:    1.Android端应用包名和签名     2.IOS端BundleId     3.APP的logo     4.APP的类别和应用简介     ...

  4. 坑爹的微信支付(签名错误)

    前言 以前调微信支付,直接把demo粘过来改改,或者从老项目粘过来,这次接手一个一年之前的项目,说微信支付没调通,好吧,我就调吧 正文 1:之前的body写的是中文,改成英文 结果:失败(不过这一步很 ...

  5. h5游戏使用微信h5支付,刷新页面问题解决

    遇到的问题: h5游戏,或任何h5程序,使用微信h5支付后,自动刷了页面,导致用户体验极差 问题根本原因: h5端使用微信支付时,使用了以下代码 window.localtion.href = &qu ...

  6. 微信html5 支付接口,黄聪:详解申请微信h5支付方法,开通微信h5网页支付接口(转)...

    现在大街小巷的商家都在使用微信支付, 但是一些商家使用的是个人微信收款, 这个虽然很便利, 但是如果你想要数据统计汇总, 让客户在网络上在线付款, 就需要用到微信的h5支付. 微信h5支付 今天子恒老 ...

  7. 个人申请微信H5支付接口(个人免签约支付平台)

    以下仅对企业开放的,如果个人想要申请 转到网址狸云支付 - 行业领先的免签约支付平台,提供微信支付接口,支付宝H5支付接口,个人支付接口申请,二维码支付接口​http://www.alywlzf.co ...

  8. 详解申请微信h5支付方法,开通微信h5网页支付接口(转)

    现在大街小巷的商家都在使用微信支付, 但是一些商家使用的是个人微信收款, 这个虽然很便利, 但是如果你想要数据统计汇总, 让客户在网络上在线付款, 就需要用到微信的h5支付. 微信h5支付 今天子恒老 ...

  9. java微信网页支付_java实现微信H5支付

    原标题:java实现微信H5支付 前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹 ...

最新文章

  1. C++中nothrow的介绍及使用
  2. IT项目管理之系统部署
  3. 报错引发的版本对应——tensorflow+keras+python版本对应(全)
  4. 二维数组最大关联子数组
  5. php excel 分页,excel分页线怎么增加
  6. 转行前端很迷茫,该怎么办?
  7. JAVA线程池_并发队列工作笔记0002---认识线程池_在线程池中使用队列
  8. 不能从const char *转换为LPCWSTR --VS经常碰到
  9. 计算机基础教学模式,计算机基础行动导向教学模式的应用
  10. linux用shell怎么改文件名称,linux下使用shell批量修改文件名几种方法总结
  11. 参照 Vue 官方文档一步一步搭建 Vue
  12. I/O(输入/输出)---字节流与字符流
  13. emoji.php,简单的处理emoji的PHP类库
  14. python爬虫入门教程——爬取360翻译
  15. python学习笔记(汇总)
  16. learn git branching学习整理
  17. 疫情背后,零售变革正在酝酿,手机行业或迎来线下大洗牌
  18. 各种颜色十六进制代码表
  19. 微信小程序(3)——引入百度api天气信息全过程
  20. 深入探讨 Room 2.4.0 的最新进展

热门文章

  1. hereim_美句_1
  2. 编译安装Ruby 1.9.3 安装CentOS
  3. 作业: IT 行业博客网站分析和创新
  4. CYQ.Data 轻量数据层之路 使用篇-辅助工具枚举生成器 视频 C (二十)
  5. IE – File - Work Offline
  6. php 线程锁,如何使用python线程锁(实例解析)
  7. PHP+jQuery+Ajax实现用户登录与退出
  8. 在Myeclipse里使用Junit
  9. Microsoft Visual Studio (VS)2010 常用快捷键大全 便捷开发
  10. 递归--整数划分问题