微信JSAPI支付 跟 所遇到的那些坑
首先介绍一下我在调用微信支付接口使用的是 weixin.senparc SDK,非常方便好用开源的一个微信开发SDK。
weixin.senparc SDK 官网:http://weixin.senparc.com/
先去下载下来Senparc.Weixin SDK。
在调起支付接口之前,需要先要调用统一下单接口,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付。
微信 JsApi支付 在这个目录下 Senparc.Weixin.MP.Sample.Controllers 找到JsApi支付。
public ActionResult JsApi(string code, string state){if (string.IsNullOrEmpty(code)){return Content("您拒绝了授权!");}if (!state.Contains("|")){//这里的state其实是会暴露给客户端的,验证能力很弱,这里只是演示一下//实际上可以存任何想传递的数据,比如用户ID,并且需要结合例如下面的Session["OAuthAccessToken"]进行验证return Content("验证失败!请从正规途径进入!1001");}try{//获取产品信息var stateData = state.Split('|');int productId = 0;ProductModel product = null;if (int.TryParse(stateData[0], out productId)){int hc = 0;if (int.TryParse(stateData[1], out hc)){var products = ProductModel.GetFakeProductList();product = products.FirstOrDefault(z => z.Id == productId);if (product == null || product.GetHashCode() != hc){return Content("商品信息不存在,或非法进入!1002");}ViewData["product"] = product;}}//通过,用code换取access_tokenvar openIdResult = OAuthApi.GetAccessToken(TenPayV3Info.AppId, TenPayV3Info.AppSecret, code);if (openIdResult.errcode != ReturnCode.请求成功){return Content("错误:" + openIdResult.errmsg);}string sp_billno = Request["order_no"];if (string.IsNullOrEmpty(sp_billno)){//生成订单10位序列号,此处用时间和随机数生成,商户根据自己调整,保证唯一sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId, DateTime.Now.ToString("yyyyMMdd"),TenPayV3Util.BuildRandomStr(10));}else{sp_billno = Request["order_no"];}var timeStamp = TenPayV3Util.GetTimestamp();var nonceStr = TenPayV3Util.GetNoncestr();var body = product == null ? "test" : product.Name;var price = product == null ? 100 : product.Price * 100;var xmlDataInfo = new TenPayV3UnifiedorderRequestData(TenPayV3Info.AppId, TenPayV3Info.MchId, body, sp_billno, price, Request.UserHostAddress, TenPayV3Info.TenPayV3Notify, TenPayV3Type.JSAPI, openIdResult.openid, TenPayV3Info.Key, nonceStr);var result = TenPayV3.Unifiedorder(xmlDataInfo);//调用统一订单接口//JsSdkUiPackage jsPackage = new JsSdkUiPackage(TenPayV3Info.AppId, timeStamp, nonceStr,);var package = string.Format("prepay_id={0}", result.prepay_id);ViewData["appId"] = TenPayV3Info.AppId;ViewData["timeStamp"] = timeStamp;ViewData["nonceStr"] = nonceStr;ViewData["package"] = package;ViewData["paySign"] = TenPayV3.GetJsPaySign(TenPayV3Info.AppId, timeStamp, nonceStr, package, TenPayV3Info.Key);return View();}catch (Exception ex){var msg = ex.Message;msg += "<br>" + ex.StackTrace;msg += "<br>==Source==<br>" + ex.Source;if (ex.InnerException != null){msg += "<br>===InnerException===<br>" + ex.InnerException.Message;}return Content(msg);}}
先在微信服务后台生成预支付交易单,获得预支付订单号。
先说说在统一下单这里遇到的坑。
1.在统一下单的时候解析返回结果,一直出现以下问题:您没有JSAPI支付权限
<xml>
<return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[您没有JSAPI支付权限]]></return_msg>
</xml>
1)先看看你的公众号微信支付设置是否正确。
关于如何配置微信支付:可以参考这个 http://jingyan.baidu.com/article/77b8dc7fef360d6174eab690.html
2)检查你的授权目录是否正确,格式要这样,后面记得别漏了一个/ 例如:http://test.cn/u/
3)检查需要传过去的账户参数,上公众号还有商户号检查你的账户参数是否正确。我在开发当中就出现,微信公众号商户号,appid 是分别不同两个公众号的,坑啊,找了好久,觉得不对劲,原来是给的配置参数密钥不对。
这里详细说一下对应的参数:
MCHID:商户号(必须配置,开户邮件中可查看),商户申请微信支付后,由微信支付分配的商户收款账号。
APPID:微信开放平台审核通过的应用APPID,appid是微信公众账号或开放平台APP的唯一标识,在公众平台申请公众账号或者在开放平台申请APP账号后,微信会自动分配对应的appid用于标识该应用。可在微信公众平台-->开发者中心查看,商户的微信支付审核通过邮件中也会包含该字段值.
KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置),交易过程生成签名的密钥,仅保留在商户系统和微信支付后台,不会在网络中传播。商户妥善保管该Key,切勿在网络中传输,不能在其他客户端中存储,保证key不会被泄漏。商户可根据邮件提示登录微信商户平台进行设置。也可按一下路径设置:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置.
APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置)
2.在统一下单,解析返回来的结果我出现了商户号mch_id与appid不匹配这个问题
<xml>
<return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[商户号mch_id与appid不匹配]]></return_msg>
</xml>
原因是我拿到的商户号不是这个公众号的。一定要检查是不是这个公众号的商户号。
3.在统一下单,解析返回来的结果出现 appid and openid not match,appid和openid不匹配。
<xml>
<return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[appid and openid not match]]></return_msg>
</xml>
原因是我这个用户的openid 不是这个公众号的
3.在统一下单,解析返回来的结果出现 CDATA[openid is invalid],openid无效
<xml>
<return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[openid is invalid]]></return_msg>
</xml>
原因是,传过去不是有效的opendid。不小心看错了,把用户id 当做openid传过去了。
当统一下单成功,会返回以下格式的参数
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx2421b1c4370ec43b]]></appid> <mch_id><![CDATA[10000100]]></mch_id> <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str> <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id> <trade_type><![CDATA[APP]]></trade_type></xml>
解析获得预支付单号:
string prepayId = res.Element("xml").Element("prepay_id").Value; //获取预支付订单号
给页面对应地参数
ViewData["appId"] = TenPayV3Info.AppId;ViewData["timeStamp"] = timeStamp;ViewData["nonceStr"] = nonceStr;ViewData["package"] = package;ViewData["paySign"] = TenPayV3.GetJsPaySign(TenPayV3Info.AppId, timeStamp, nonceStr, package, TenPayV3Info.Key);
静态页面js调用:
wx.chooseWXPay({timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符nonceStr: '', // 支付签名随机串,不长于 32 位package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'paySign: '', // 支付签名success: function (res) { if (res.err_msg == "get_brand_wcpay_request:ok") {//支付成功} else { //支付失败} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。} });
微信JSAPI支付 跟 所遇到的那些坑相关推荐
- php微信jsapi支付小结,ThinkPHP接入微信支付 - JSAPI支付
一.支付准备 二.获取用户openid 首先,到微信公众平台后台 - 设置 - 网页授权域名(别忘了添加开发者) // 在头部引入WechatPubService.php文件,见附录一 use app ...
- 微信JSApi支付~订单号和微信交易号
返回目录 谈谈transactionId和out_trade_no 前一篇微信JSApi支付~坑和如何填坑文章反映不错,所以又写了个后篇,呵呵. 每个第三方在线支付系统中都会有至少两类订单号,其一为支 ...
- 微信JSAPI支付对接流程及支付接口设计
文章目录 前言 一.JSAPI支付场景及逻辑 二.开发步骤 1.设置支付目录 2.设置授权域名 3.业务流程 三.代码设计 1. 支付页面 2. Controller 3. JS调起支付 4. 工具类 ...
- 关于微信JSAPI支付成功后,点击完成后没有返回值并且页面被自动关闭问题
微信JSAPI支付成功后,点击完成后没有返回值并且页面被自动关闭 简介 解决方式 错误的处理方式 总结 简介 最近很多人可能都遇到一个问题,在使用微信JSAPI支付成功后,不走成功的回调方法,只有支付 ...
- JAVA+微信JSAPI支付
JAVA+微信JSAPI支付 引入依赖 获取请求ip 组装微信支付请求 回调处理 引入依赖 <dependency><groupId>com.github.binarywang ...
- php接入微信JSAPI支付,微信内拉起支付,基于thinkPHP框架 WeChatDeveloper支付类包
文章:php接入微信支付,扫码支付和H5支付(非微信浏览器),基于thinkPHP框架 WeChatDeveloper支付类包 踩坑指南 文章:php快速接入支付宝即时支付,PC网站支付和手机网站支付 ...
- php 微信统一下单接口,微信JSAPI支付,统一下单接口
微信JSAPI支付,统一下单接口 今天小编给大家分享一下微信支付的统一下单接口,其实微信官网上也有SDK和DEMO下载了,但是不太好理解,小编就自己整理一份容易理解的代码,看不懂官方的,就来看看小编这 ...
- C# .NETMVC 微信JSAPI支付
C# .NET MVC微信JSAPI支付 经过本人不断翻找资料和百度终于结合一些大佬的经验和思路弄出来一个MVC的微信支付了. 再弄微信支付之前我们需要先有一个商户号,并且开通了微信支付的JSAPI支 ...
- Java 微信jsapi支付
spring boot微信jsapi支付 话不多说,撸起袖子就是干,下面上源码 pom.xml 配置文件 resources/wx.properties 配置类 service(WechatPaySe ...
最新文章
- 某程序员求助:喜欢上漂亮的产品经理却不敢追,追不上太尴尬,公司也不允许办公室恋情!网友:别怂!...
- 经验风险、期望风险、结构风险
- machit r语言_机器学习应该准备哪些数学预备知识?
- docker 添加端口映射_Docker快速搭建PHP开发环境详细教程
- linux双网卡绑定同一IP步骤,linux系统双网卡绑定单个IP地址
- setnx是原子操作吗_谈谈Volatile关键字?为什么不能保证原子性?用什么可以替代?为什么?...
- Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了
- C#中的i++和++i
- HTML5 文档头部
- STM32+华为云IoTDA,带你设计一个属于自己的动态密码锁
- 1、ClassLoader.getResourceAsStream() 与Class.getResourceAsStream()的区别
- 怎么区分zh和ch_zh,ch,sh,和z,c,s怎么分辨?
- linux增加虚拟内存
- 知识就是力量!(内含赠书福利)
- swiper教程--swiper的基础使用(二十)
- linux路由器压力测试,Apache Bench Web 压力测试
- fix协议封装挑战-数据有效性校验
- 用Excel体验梯度下降法计算函数极值
- MSP430F149IPMR
- 使用selenium爬取唯品会
热门文章
- ibatis中iterate的用法(conjunction=or ,) .
- 简单梳理下git的使用感受,思考git中最重要的是什么
- U盘出现物理故障都有哪些表现
- python实现支持向量机实例_一个简单的案例带你了解支持向量机算法(Python代码)...
- 微信小程序针对iphoneX以上机型,获取底部高度
- rest_framework学习之解析器(Parsers)
- 索尼BDP-S580回顾 - 一个最好的蓝光播放器在2011年
- WC2015简短感想
- 通过智能一体化管理系统自定义表单和自定义字段设计
- 判断两个矩形是否重叠