微信支付返现金红包的sdk怎么设置,报错了,

支付错误码说明
1. 支付后台接口的返回码与OpenAPI返回码一致,详见:。
2. 在Q点直购联调中,会遇到“支付失败”的错误提示。为帮助开发者联调,特别提供了更详细的联调错误码。
点开“详细错误信息”,可以看到一串错误码。如果遇到这些错误提示,请根据错误码并参照下文建议进行错误排查。
错误码解释:开发者调用v3/pay/buy_goods接口时,请求参数不合法。
处理建议:
1. 请参照检查参数是否符合协议规范。
2. 通过日志查看支付返回的错误描述。
特别提示:
遇到下面的部分错误码时,需要通过tcpdump获取9001端口的数据包以检查返回内容是否合法。
正确的命令如下:
tcpdump -i [ethx]
src host [ip] and port 9001 -X -v -s0
[]中的ethx请替换为发货服务器网卡,如eth0或eth1。
[]中的ip请替换为发货服务器的ip。
错误码解释:调用发货通知过早,订单尚未挂起。
处理建议:开发者可稍候再试(可等待几秒后,重复通知)。
错误码解释:平台后台系统设置错误。
处理建议:请及时联系开放平台企业QQ协助处理。
错误码解释:分区发货配置不匹配。
处理建议:开发者检查更新的分区发货信息是否及时同步。
错误码解释:支付失败,账户余额不足。
处理建议:登录“管理中心”,点击“支付结算”tab,在最下方点击“联调工具”进行测试Q点充值。
错误码解释:购买业务金额参数错误。
处理建议:检查接口payitem中的单价price(最小单位2Q点)和数量num的参数值(最大9999)。
错误码解释:单笔交易金额超过限制。
处理建议:单笔交易金额不能超过2000QB。
错误码解释:账户不存在。
处理建议:开发者检查帐户是否建立,可尝试充值Q点,或检查环境是否匹配。
错误码解释:交易金额超过代用币单日最高限制。
处理建议:交易金额不能超过10000QB/天。
错误码解释:购买业务金额参数错误。
处理建议:检查接口payitem中的单价price(最小单位2Q点)和数量num的参数值(最大9999)。
错误码解释:连续请求失败次数超过限制,业务暂时被锁定。
处理建议:开发者检查自身网关后,可过段时间重试。造成错误的原因可能有:网关不可用,返回格式错误,返回时间超过协议时间。
如果请求连续失败20次,业务将被锁定20秒;如果5分钟内请求次数大于30次,且发货网关调用开发者接口的错误率超过50%,业务将被锁定20秒。
错误码解释:zoneid参数错误。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误。
错误码解释:IP链接失败。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误。
错误码解释:开发者发货网关返回{"ret":-1,"msg":""}。
处理建议:开发者检查自身定义的返回码为-1所对应的描述,并通过tcpdump获取9001端口的数据包以检查返回内容。
错误码解释:开发者发货网关返回{"ret":1,"msg":""}。
处理建议:开发者检查自身定义的返回码为1所对应的描述,并通过tcpdump获取9001端口的数据包以检查返回内容。
错误码解释:开发者发货网关返回{"ret":2,"msg":""}。
处理建议:开发者检查自身定义的返回码为2所对应的描述,并通过tcpdump获取9001端口的数据包以检查返回内容。
错误码解释:开发者发货网关返回{"ret":3,"msg":""}。
处理建议:开发者检查自身定义的返回码为3所对应的描述,并通过tcpdump获取9001端口的数据包以检查返回内容。
错误码解释:开发者发货网关返回{"ret":4,"msg":""}。
处理建议:开发者检查自身定义的返回码为4所对应的描述,并通过tcpdump获取9001端口的数据包以检查返回内容。
错误码解释:其他错误。
处理建议:开发者检查应用程序和配置是否有误,并通过tcpdump获取9001端口的数据包以检查返回内容是否合法。
错误码解释:错误的请求,开发者发货网关返回http 400。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误。
错误码解释:请求被禁止,开发者发货网关返回http 403。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误。
错误码解释:CGI不存在,开发者发货网关返回http 404。
处理建议:开发者按照错误码解释检查发货网关的发货CGI是否可访问。
错误码解释:请求超时,开发者发货网关返回http 408。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误。
错误码解释:请求url太长,开发者发货网关返回http 414。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误。
错误码解释:调用开发者发货网关返回http 497,http请求发送到https端口上。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误。
错误码解释:调用开发者发货网关返回http 500。
处理建议:开发者webserver发生500的内部错误,具体信息请tcpdump数据包以检查返回内容。
错误码解释:cee_extend参数错误。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误。
错误码解释:(对不起,交易流水不存在)token过期,需要重新获取。一般是前后端接口调用环境不一致,需要统一使用沙箱或者现网环境,参考处理建议。
处理建议:
服务器端/v3/pay/buy_goods沙箱需用119.147.19.43(CEE:1.254.254.22)发起请求(现网使用域名openapi.tencentyun.com)
前端fusion2.dialog.buy沙箱设置sandbox:true(现网false)
服务器端/mpay/buy_goods_m沙箱需用119.147.19.43(CEE:1.254.254.22)发起请求(现网使用域名openapi.tencentyun.com)
客户端支付初始化的时候,setEnv沙箱设置为test(现网release)
如上检查均正常,可能是如下少见的情况:
应用侧这边在服务端获取url_params值后使用了比如换行符等特殊符号,并把这些带有特殊符号的值传入到前端使用时也会出现这个错误码。
错误码解释:没有接入支付。
处理建议:开发者检查应用是否已申请接入支付,或检查APPID是否有误。
错误码解释:应用配置信息未同步。
处理建议:开发者检查应用分区配置是否完成同步,同步方法:登录“管理中心”,点击“支付结算”tab,在“支付接入”页面点击“修改分区信息”,确认分区发货信息正确后,点击“同步到沙箱”或“同步到现网”。
错误码解释:用户设置或策略要求验密保,用户没有密保导致禁止消费。
处理建议:您本次操作需要验证密保,请绑定QQ安全中心手机版后重试:aq.qq.com/app。
错误码解释:消费操作存在风险。
处理建议:如果您是游戏玩家,请先修改QQ密码后尝试消费(aq.qq.com/gm)。如果依然报错,请联系游戏客服人员。如果您是游戏开发商,此错误码一般出现在沙箱测试环境,如果沙箱环境全部测试帐号都报错,请立刻联系企业QQ处理。如果是个别现网玩家反馈,建议改密(aq.qq.com/gm)或者联系企业QQ。
错误码解释:用户设置或策略要求验密保,用户没有密保导致禁止消费。
处理建议:QQ帐号存在安全风险,为确保Q币安全,请绑定密保手机后验证密保即可消费!aq.qq.com/sj。
错误码解释:用户设置或策略要求验密保,用户没有密保导致禁止消费。
处理建议:QQ帐号存在安全风险,为确保Q币安全,请绑定密保手机后验证密保即可消费!aq.qq.com/sj。
错误码解释:用户设置或策略要求验密保,用户没有密保导致禁止消费。
处理建议:QQ帐号存在安全风险,为确保Q币安全,请绑定密保手机后验证密保即可消费!aq.qq.com/sj。
错误码解释:用户设置或策略要求验密保,用户没有密保导致禁止消费。
处理建议:为了保障您的财产安全,赠送双方需要满足7天以上QQ好友关系!
错误码解释:用户设置或策略要求验密保,用户没有密保导致禁止消费。
处理建议:QQ帐号存在安全风险,为确保Q币安全,请绑定密保手机后验证密保即可消费!aq.qq.com/sj。
错误码解释:用户设置或策略要求验密保,用户没有密保导致禁止消费。
处理建议:QQ帐号存在安全风险,为确保Q币安全,请绑定密保手机后验证密保即可消费!aq.qq.com/sj。
错误码解释:用户设置或策略要求验密保,用户没有密保导致禁止消费。
处理建议:QQ帐号存在安全风险,为确保Q币安全,请绑定密保手机后验证密保即可消费!aq.qq.com/sj。
错误码解释:用户设置或策略要求验密保,用户没有密保导致禁止消费。
处理建议:QQ帐号存在安全风险,为确保Q币安全,请绑定密保手机后验证密保即可消费!aq.qq.com/sj。
错误码解释:触发平台相关策略导致消费被禁止。
处理建议:QQ帐号存在安全风险,为确保Q币安全,请改密后再试!aq.qq.com/gm。
错误码解释:触发平台相关策略导致消费被禁止。
处理建议:QQ帐号存在安全风险,为确保Q币安全,请改密后再试!aq.qq.com/gm。
错误码解释:触发平台相关策略导致消费被禁止。
处理建议:网络环境存在安全风险,为确保Q币安全,请稍后再试!
错误码解释:系统错误。
处理建议:请直接联系企业QQ协助处理。
错误码解释:交易超时。
处理建议:请直接联系企业QQ协助处理。
错误码解释:频率限制。
处理建议:请直接联系企业QQ协助处理。
错误码解释:频率限制。
处理建议:请直接联系企业QQ协助处理。
错误码解释:调用充值游戏币接口fusion2.dialog.pay出现未授权。
处理建议:Q点直购不允许调用充值接口,需接入道具寄售模式。
错误码解释:开发者返回信息不合法。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误,并通过tcpdump获取9001端口的数据包以检查返回内容是否合法。
错误码解释:颁发的证书不合法或SSL连接异常。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误。
错误码解释:CA根证书不合法。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误。
错误码解释:curl链接建立但返回超时。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误。
错误码解释:JSON解析错误,开发者发货网关返回信息不符合JSON格式,通常是开发者发货CGI逻辑出错,返回一段错误信息。
处理建议:开发者按照错误码解释检查应用程序和配置是否有误,并通过tcpdump获取9001端口的数据包以检查返回内容是否合法。
正常返回示例:{"ret":0,"msg":"OK"}。
错误码解释:调用开发者发货网关返回http 502。
处理建议:开发者检查自身发货网关是否可用。造成错误的原因可能有:端口未启用,服务器配置不正确。
错误码解释:发货网关的协议要求在2秒之内返回发货结果,开发者发货返回时间已超过协议时间。
处理建议:开发者按照协议规范在2秒之内返回发货结果。出现此错误开发者可按下面的步骤进行检查:
(1)通过telnet对应的IP和端口是否成功,例如telnet 192.168.1.123 443。
(2)通过curl工具拉取对应的url地址的数据是否成功。
(3)统计请求从接收到处理完耗时是否超过了2秒。
(4)查看web服务器进程是否存在,例如tomcat没有启动起来。
(5)检查服务器配置是否正确,例如nginx配置的反向代理不正确。
(6)检查是否配置IP限制策略。
(7)通过tcp抓包工具,如tcpdump,查看请求处理完之后tcp连接是否正常关闭,即抓包的是FIN包而不是RST包。
(8)查看网络是否有丢包现象,tcpdump抓包拿到请求的源IP,使用Ping命令,监控一段时间,看是否有丢包,即Ping打印出来的包序号不连续。
错误码解释:系统错误。
处理建议:系统错误,请通过联系支付技术支持人员。
开发者在联调的过程中,如遇到其他问题,可参考。做过微信支付的请进,签名错误的问题!
<a data-traceid="question_detail_above_text_l&&
最近在做微信支付,调用微信的统一下单支付接口http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1时,老是返回“签名错误”,偶尔可以成功,不知道是怎么回事。我在日志中打印出生成的字符串和签名,然后用相同的数据在微信支付提供的在线支付调试工具生成签名,发现生成的签名结果一样!生成的最终xml也一样,但接口就是返回
&xml&&return_code&&![CDATA[FAIL]]&&/return_code&
&return_msg&&![CDATA[签名错误]]&&/return_msg&
请问这种问题该怎么解决啊?急!!!
以下是问题补充:
:用的支付方式是JSAPI,后台用的Java,生成签名相关的工具类用的都是微信扫码支付demo里的。
API KEY用的商户那个密钥,不是APP SECRETE
--- 共有 1 条评论 ---
确实是问题所在,多谢。
今天看了一下微信支付官网的在线签名工具,发现引用的js文件里的实现居然做了调整,签名的结果也和之前不一样了!而且我用它签名生成的xml数据提交给统一下单接口,还是提示签名错误??现在这不知道微信提供的这个签名工具到底是不是和它后台的实现一致了……
我只是路过一下
我只是顶一下
我也遇到同样的问题,你的问题解决了吗?我发了贴子,如果解决了可以回复一下.感谢!
--- 共有 2 条评论 ---
: 我的签名用微信支付接口签名校验工具 可以通过 就是支付的时候签名错误?换一个下秘钥就可以了吗?
如果确定签名方式没问题,就把密钥重新设置一下,我当时一直以为签名有问题,后来把密钥重新设置跟之前一样,再试发现解决了,不清楚是不是微信支付的问题
* @param origin 原始字符串
* @return 经过MD5加密之后的结果
public static String MD5Encode(String origin) {
String resultString =
resultString =
MessageDigest md = MessageDigest.getInstance("MD5");
//resultString = byteArrayToHexString(md.digest(resultString.getBytes())); ///深坑啊,赶紧注释掉,用UTF-8
resultString = byteArrayToHexString(md.digest(resultString.getBytes("utf-8")));
} catch (Exception e) {
e.printStackTrace();
return resultS
微信官方给的签名方法中MD5编码有问题,要转为utf-8
--- 共有 1 条评论 ---
非常感谢,开发用的ubuntu系统,在本地测试统一下单通过,打包到测试服务器(为centos)死活报签名错误(错在哪里也没有提示,真的坑),找了两个下午,排除签名不通过各种情况,硬是不知道错误出在哪里,war包放在阿里云主机也正常,翻了好久终于翻到这里,问题解决!再次感谢!
HttpRequest httpRequest = HttpRequest.post("https://api.mch.weixin.qq.com/pay/unifiedorder");
String x = xstream.toXML(data);
httpRequest.body( StringUtil.convertCharset(x, "UTF-8", "ISO-8859-1"));
HttpResponse response = httpRequest.send();
String body = response.body();
body = StringUtil.convertCharset(body, "ISO-8859-1", "UTF-8");
StringUtil.convertCharset(x, "UTF-8", "ISO-8859-1")
给微信传递的时候把UTF-8 转换成 ISO-8859-1
--- 共有 2 条评论 ---
回复 @塔拉夏 : 深深的赞同。。
先不说弄3个平台(公众、开放、商户),设置各种复杂,凌乱。。
手册也写的不明了。
同意你的做法,并且测试通过了。另外,本来没有账号,因为开发遇到相同问题,看到这个回复,特意注册一个账号来骂微信,脑残。当然新账号注册1个小时内不允许操作,但我愣是在这里等了一个小时,就是要骂微信,脑残!!!不是说它的api水平有多烂,但你至少说明白一点啊,每次看微信api都头痛。比阿里差的不是一个数量级的。调阿里api都是,优雅、简单、舒服,效率高。调微信api的感觉是,愤怒、头痛、恶心,想打人。
同骂微信,卡在了签名这里。
--- 共有 3 条评论 ---
: 你是怎么解决的
: 你设置的attach是不是中文,后来我改成英文就可以了
我也遇到同样的问题,微信深坑啊!签名和官方测试生成的一样样的,就是验签不过。
金额一定为整型,望后来人别卡在这里。如果实在找不出原因,可以将值暂时替换成写死的,因为它不是所有参数都验证,有些参数如果传错了也是会提示签名错误。
这货的设置的api密钥里头不能有大写字母,不然死活不过微信支付SDK漏洞xxe漏洞修复解决方案微信支付SDK漏洞xxe漏洞修复解决方案郑州小程序开发百家号微信支付SDK漏洞xxe漏洞修复解决方案,在没说解决方案之前,咱们先来回顾下:7月3日,国外安全社区里一名白帽子披露了微信支付官方SDK存在严重的XXE漏洞,可导致商家服务器被入侵,并且黑客可避开真实支付通道,用虚假的支付通知来购买任意产品。另外,陌陌、vivo已经验证被该漏洞影响。微信支付skd漏洞腾讯方面接受《中国经营报》记者采访时表示:“微信支付技术安全团队已第一时间关注及排查,并于今天中午对官方网站上该SDK漏洞进行更新,修复了已知的安全漏洞,并在此提醒商户及时更新。请大家放心使用微信支付。”具体通知如下:微信支付接口安全提醒通知尊敬的微信支付商户: 您的系统在接受微信支付XML格式的商户回调通知(支付成功通知、退款成功通知、委托代扣签约/解约/扣款通知、车主解约通知)时,如未正确地进行安全设置或编码,将会引入有较大安全隐患的XML 外部实体注入漏洞(XML External Entity Injection,简称 XXE)。
请贵司研发人员务必参考微信支付安全实践指引,进行安全隐患确认和排除。 微信支付团队 号 虽然微信官方已经修复更新了sdk,并且也及时通知了商户进行升级更新,但是大部分商家还是感到恐慌手足无措,因为他们不懂程序,他们不知道到底有多大危害,并且他们大部分是找的网络公司进行开发的,他们只有联系开发服务商来进行处理。微信支付XXE漏洞有些网络公司服务商,本身技术能力都有限,只是代理了一些其他公司的产品来进行销售,比如模板网站、模版微站、模板小程序等,他们收到客户反馈的问题后,依靠自身的技术无法进行修复,也感到束手无策。在此我作为喝彩科技的技术工程师,为业界同行尽一份绵薄之力,来为大家分享一下《微信支付SDK漏洞xxe漏洞修复解决方案》。首先先来看下漏洞出现的原因,微信支付sdk下XXE漏洞其实就是XML外部实体注入漏洞(XML External Entity Injection,简称 XXE),该安全问题是由XML组件默认没有禁用外部实体引用导致。那么这个问题会出现在哪些场景呢?场景1:支付成功通知;场景2:退款成功通知;场景3:委托代扣签约、解约、扣款通知;场景4:车主解约通知;微信支付成功通知说白了就是出现在支付回调通知的场景中,比如你买的商品,支付成功了,微信上是不是有个支付成功通知。那这个时候如果没修复此漏洞的情况下,就会被黑客利用。再比如,你买个东西,用微信支付成功了,然后又不想买了,申请退款,退款成功后,是不是也收到个退款成功通知,漏洞就是在这个时候出现的。好了,既然问题和场景都找到了,下一步就是如何修复?大部分商家用的系统都是网络公司服务商开发的,而不是直接用的官方demo,今天针对PHP编程语言,我详细给大家说下修复方案(并附上修复代码)1、首先找到微信支付所对应的文件夹。(自行查找,不再赘述)2、其次找到微信支付的代码,一般是在WxPay.Data.php文件或者是Notify.php文件中,根据自己实际情况具体查找。3、然后找到如下代码部分微信支付sdk漏洞php修复方案4、最后将在这部分代码前,加上libxml_disable_entity_loader(true);5、进行漏洞测试验证。如果不想改动代码,也可以再不修改代码的情况下,借助于WAF或者RASP来修复。具体方法:在WAF添加关键词过滤规则:<!DOCTYPE和<!ENTITY,或SYSTEM和PUBLIC。当然此方法只是临时应急的方法,慎重使用。另外网上爆出的漏洞是基于微信支付java版的SDK,我在此也给大家说下针对java版的修复方案:微信官方支付SDK“WXPayUtil.java”没有对xxe漏洞进行防护,导致使用方直接在demo上进行开发。根据WXPayUtil.java的demo,需要禁用DTDs。为什么要禁用DTD呢?由于大多数脚本解析器并不会默认禁用DTD、Entity,因此系统出现XXE漏洞的可能性很高。Java解析XML的常用三方库,如果不禁用DTD、Entity都会导致XXE漏洞。java修复方案,直接找到对应代码,加上DocumentBuilderFactory.setExpandEntityReferences(false);或者如下图所示:微信支付sdk漏洞java修复方案好了,今天分享到这里,有什么问题可以关注我,向我提问。郑重声明:本文由赵德志本人原创,首发于百度百家号,任何单位和个人转载时请务必要注明出处,否则后果自负。本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。郑州小程序开发百家号最近更新:简介:每天为您提供原创资讯作者最新文章相关文章微信公众号开发中遇到的问题——支付(二)
第一次开发微信公众号,也是第一次接触微信公众号的支付,我使用的是jssdk,用h5页面调用的支付,后台使用的是java。首先声明,我不是一个愤世嫉俗的人,也不喜欢吐槽,我认为别人提供接口就已经很不错了,干嘛要吐槽呢?但是,这一次,我不得不说,微信公众号支付的文档真是渣!!!你没有也就算了,既然有了,为何不好好写?就好像别人问你路该怎么走,你给别人指了路,但指偏了。下面我记录一下我这次微信支付开发中遇到的坑,希望能给大家一点帮助。开始之前,有几个地方需要配置一下(比较容易遗忘):1、js接口安全域名
公众号设置————功能设置
2、微信支付中的开发配置
支付授权目录:看了文档之后,我以为是jsp页面的地址,最后,才发现原来是调用后台方法的地址,只是不用写到方法名,如果你调用支付的方法是www.XXX.com/pay/prepay.action;那么你的支付授权目录应该是:www.XXX.com/pay/
测试授权目录:就是测试环境的授权目录。可能有些人不知道支付怎么测试,那么,你需要做两点:①调用支付方法的链接地址。②把该链接地址发送到测试公众号的聊天记录里面。注意是你自己测试微信公众号的链接地址中。
测试白名单:测试微信公众号支付时,把你们自己的微信账号添加到测试白名单中;
3、我想吐槽一下,我的支付签名有问题(后来换ios系统测试时弹出框弹出来的),但是我之前用android手机一直测试,都报的是get_brand_wcpay_request:fail或chooseWXPay:fail(取决于你用哪种方法),你根本不知道究竟是什么错误。
4、当我要调用支付接口时,打开商户的微信公众号支付文档,发现了一个H5调起的支付API,我本以为这里的方法应该是chooseWXPay,但是为什么是function onBridgeReady。。。。。。这又是什么鬼?彻底把我搞晕了,有没有?后来查资料才知道,两个方法的本质是一样的,新版本的微信都会使用chooseWXPay方法,chooseWXPay方法中封装了onBridgeReady这东西,但是用onBridgeReady不用引用http://res.wx.qq.com/open/js/jweixin-1.0.0.js文件,用chooseWXPay方法方法需要引用js文件方法,因为chooseWXPay方法封装了onBridgeReady,查看js文件就可以知道。
既然是H5页面调用,那么肯定首先是要看jssdk文档了:一、绑定域名
这里有一点建议,绑定的域名最好是你开发用的域名,如果你开发用的是二级域名,那么就用二级域名,不要用一级域名,因为如果在该一级域名下面还有其他的二级域名,也要开发另一个公众号,那么就会遇到问题(我没有试过,这两天在网上查资料时看到的)。二、引入js文件,在调用微信支付的页面引入http://res.wx.qq.com/open/js/jweixin-1.0.0.js;三、通过config接口注入权限验证配置
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名,见附录1
jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2,如果只是支付,只用这一个参数就够了
参数说明:debug,测试环境下打开,会alert出注入参数是否正确的信息;其它几个参数一定要注意大小写!大小写!大小写!继续向下看,我会给出timestamp,nonceStr和signature几个参数的算法;
四、通过ready接口处理成功验证
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});五、发起支付
wx.ready(function(){
wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
//如果你按照正常的jQuery逻辑,下面如果发送错误,一定是error,那你就太天真了,当然,jssdk文档中也有提到
fail: function(res) {
//接口调用失败时执行的回调函数。
complete: function(res) {
//接口调用完成时执行的回调函数,无论成功或失败都会执行。
cancel: function(res) {
//用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。
trigger: function(res) {
//监听Menu中的按钮点击时触发的方法,该方法仅支持Menu中的相关接口。
});至此,微信公众号支付的jssdk已经描述完毕,但是不要高兴得太早,微信支付的坑才刚刚开始。1、wx.config中signature的算法
jssdk文档上面给出了算法的步骤,但是没有给一个demo,这里我给出大家一个signature的demo,大家可以根据这个按照自己的需要进行修改。
首先,我封装了一个Jssdk对象(该对象封装了 wx.config中所需要的参数):
&span style="font-family:Microsoft YaH"&
* 微信js-sdk安全验证
public class JsSdk {
public String getNoncestr() {
public void setNoncestr(String noncestr) {
this.noncestr =
public String getTimestamp() {
public void setTimestamp(String timestamp) {
this.timestamp =
public String getUrl() {
public void setUrl(String url) {
this.url =
public String getSignature() {
public void setSignature(String signature) {
this.signature =
然后,给Jssdk对象属性赋值:
&span style="font-family:Microsoft YaH"&
public static JsSdk sign(String jsapi_ticket, String url) {
JsSdk jsSdk = new JsSdk();
jsSdk.setUrl(url);
String nonce_str = create_nonce_str();
jsSdk.setNoncestr(nonce_str);
String timestamp = create_timestamp();
jsSdk.setTimestamp(timestamp);
String signature = "";
//注意这里参数名必须全部小写,且必须有序
String string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"×tamp=" + timestamp +
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
jsSdk.setSignature(signature);
catch (NoSuchAlgorithmException e)
e.printStackTrace();
catch (UnsupportedEncodingException e)
e.printStackTrace();
return jsS
&/span&生成随机字符串:这里大家可以选择其他算法&span style="font-family:Microsoft YaH"&
private static String create_nonce_str() {
return UUID.randomUUID().toString().substring(0, 20);
&/span&生成时间戳的方法:&span style="font-family:Microsoft YaH"&
private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
sign方法的调用需要两个参数,jsapi_ticket和url:
jsapi_ticket根据token来获取,https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi,
url为request.getRequestURL().toString()来获取,实际上就是调用支付方法的完整URL。
2、chooseWXPay方法中的timestamp,nonceStr和wx.config中的参数是一样的,signType为MD53、chooseWXPay中的package,格式是'prepay_id=${prepayId }',${prepayId }是后台计算得出的,我用的是java。
prepayId的算法:
&span style="font-family:Microsoft YaH"&
SortedMap&Object, Object& parameters = new TreeMap&Object,Object&();
parameters.put("appid", appId);//你自己公众号的appId
parameters.put("mch_id", CacheManager.getValue("MCH_ID"));//此处为商户号
parameters.put("nonce_str", jssdk.getNoncestr());//封装在jssdk对象中的noncestr
parameters.put("body", "测试");
String outTraceNo = getOutTradeNo();//生成订单号的方法,测试时可以随便指定
log.info("outTraceNo = " + outTraceNo);
parameters.put("out_trade_no", outTraceNo);
parameters.put("total_fee", 1);
parameters.put("spbill_create_ip", CommonUtil.getRealIp(request));//测试时就写成本机ip即可
parameters.put("notify_url", "");
parameters.put("trade_type", "JSAPI");
parameters.put("openid", openid);
parameters.put("sign", PayCommonUtil.createSign("utf-8", parameters));
String requestXml = PayCommonUtil.getRequestXml(parameters);
log.info("requestXml = " + requestXml);
prepayId = AdvancedUtil.createOrder(requestXml);
createSign和getRequestXml方法:
&span style="font-family:Microsoft YaH"&
* @Description:sign签名
* @param characterEncoding 编码格式
* @param parameters 请求参数
@SuppressWarnings("rawtypes")
public static String createSign(String characterEncoding,SortedMap&Object,Object& parameters){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
//设置微信商户平台上的秘钥
sb.append("key=" + CacheManager.getValue("API_KEY"));
String sign = CommonUtil.MD5(sb.toString(), characterEncoding).toUpperCase();
* @Description:将请求参数转换为xml格式的string
* @param parameters
@SuppressWarnings("rawtypes")
public static String getRequestXml(SortedMap&Object,Object& parameters){
StringBuffer sb = new StringBuffer();
sb.append("&xml&");
Set es = parameters.entrySet();
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = CommonUtil.getStringNotNullValue(entry.getKey());
String v = CommonUtil.getStringNotNullValue(entry.getValue());
if ("attach".equalsIgnoreCase(k)||"body".equalsIgnoreCase(k)||"sign".equalsIgnoreCase(k)) {
sb.append("&"+k+"&"+"&![CDATA["+v+"]]&&/"+k+"&");
sb.append("&"+k+"&"+v+"&/"+k+"&");
sb.append("&/xml&");
return sb.toString();
&/span&4、wx.chooseWXPay方法中的paySign测算法&span style="font-family:Microsoft YaH"&
SortedMap&Object, Object& paySignParameters = new TreeMap&Object,Object&();
paySignParameters.put("appId", appId);
paySignParameters.put("nonceStr", jssdk.getNoncestr());
paySignParameters.put("package", "prepay_id=" + prepayId);
paySignParameters.put("signType", "MD5");
paySignParameters.put("timeStamp", jssdk.getTimestamp());
paySign = PayCommonUtil.createSign("utf-8", paySignParameters);
5、到这里,我也必须吐槽一下微信搞了三个类似签名的东西,wx.config中signature,wx.chooseWXPay中的paySign,和调用统一下单接口所用的sign。这三个东西彻底把我搞晕了,算法描述也不是很清楚,希望我上面写的能给大家一些帮助。
后续还会持续更新一些微信开发中遇到的其他一些不清不楚的地方。。。。。敬请期待
没有更多推荐了,

我要回帖

更多关于 怎样用微信扫一扫付款 的文章

 

随机推荐