手机出现调用微信jsapi支付没反应JSAPI是怎么回事

微信支付开发h5调用
您当前位置: &
[ 所属分类
| 时间 2015 |
作者 红领巾 ]
这两天做微信支付开发。碰到大坑。纠结死我了。好不容做完。
后台java:直接上代码:注意区分前后端的变量大小写。。。
@RequestMapping(value = "/index")public Model
index(@RequestParam(value = "openid", required = true) String openid ,Model model,HttpServletRequest request) throws Exception{
("************openid***********为:"+openid);
//获取prepayid
Map&String ,String & map=new HashMap&String,String&();
WeiXinConfig wcf=weiXinBaseService.getWeiXinConfig();
String nonceStr=UUID.randomUUID().toString().substring(0, 32);
oauthService.shareFactory(request);
String appid=wcf.getAppid();
long timestamp = System.currentTimeMillis() / 1000;
map.put("appid", appid );
map.put("mch_id", WebConfig.get("pay.mch_id"));
map.put("nonce_str",nonceStr);
map.put("body",
WebConfig.get("pay.body"));
map.put("out_trade_no", payWxUtil.orderNum());
map.put("total_fee", WebConfig.get("pay.price"));
map.put("spbill_create_ip",request.getRemoteAddr());
map.put("notify_url", WebConfig.get("hostAddress")+request.getContextPath()+"/babyShow/payInfo/info");
map.put("trade_type", "JSAPI");
map.put("openid", openid);
String paySign=SignUtil.getPayCustomSign(map,WebConfig.get("pay.key"));
map.put("sign",paySign);
String xml=
CommonUtil.ArrayToXml(map);
String prepayid=
payWxUtil.getPrepayid(xml);
("prepareid*****************************="+prepayid);
//封装h5页面调用参数
Map&String ,String & signMap=new HashMap&String ,String &();
signMap.put("appId", appid);
("appId="+appid);
signMap.put("timeStamp", timestamp+"");
("timeStamp="+timestamp);
signMap.put("package", "prepay_id="+prepayid);
("package="+"prepay_id="+prepayid);
signMap.put("signType", "MD5");
("singType="+"MD5");
signMap.put("nonceStr", nonceStr);
("nonceStr="+nonceStr);
model.addAttribute("paytimestamp", timestamp);
model.addAttribute("paypackage", "prepay_id="+prepayid);
model.addAttribute("paynonceStr", nonceStr);
model.addAttribute("paysignType", "MD5");
String paySign2=SignUtil.getPayCustomSign(signMap,WebConfig.get("pay.key"));
model.addAttribute("paySign",paySign2 );
("paySign="+paySign2);
以上代码获取openid需要根据网页授权来获取。这里就不多讲了。主要讲讲获取prepayid和生成h5页面所需参数,
这里面比较麻烦的就是签名的获取
查看方法SignUtil.getPayCustomSign(signMap,WebConfig.get("pay.key"))
* 获取支付所需签名
* @param ticket
* @param timeStamp
* @param card_id
* @param code
* @throws Exception
*/ public static String getPayCustomSign(Map&String, String& bizObj,String key) throws Exception {
String bizString = CommonUtil.FormatBizQueryParaMap(bizObj, false);
(bizString);
return MD5SignUtil.sign(bizString, key); }
其中CommonUtil.FormatBizQueryParaMap是用来做字典排序的。有参考了网上的例子。就没单独做。
public static String FormatBizQueryParaMap(Map&String, String& paraMap,
boolean urlencode) throws Exception {
String buff = "";
List&Map.Entry&String, String&& infoIds = new ArrayList&Map.Entry&String, String&&(
paraMap.entrySet());
Collections.sort(infoIds,
new Comparator&Map.Entry&String, String&&() {
public int compare(Map.Entry&String, String& o1,
Map.Entry&String, String& o2) {
return (o1.getKey()).toString().compareTo(
o2.getKey());
for (int i = 0; i & infoIds.size(); i++) {
Map.Entry&String, String& item = infoIds.get(i);
//System.out.println(item.getKey());
if (item.getKey() != "") {
String key = item.getKey();
String val = item.getValue();
if (urlencode) {
val = URLEncoder.encode(val, "utf-8");
buff += key + "=" + val + "&";
if (buff.isEmpty() == false) {
buff = buff.substring(0, buff.length() - 1);
} catch (Exception e) {
throw new Exception(e.getMessage());
其中MD5SignUtil.sign(bizString, key)方法如下
public static String sign(String content, String key)throws Exception{
String signStr = "";
signStr = content + "&key=" +
return MD5Util.MD5(signStr).toUpperCase();
其中MD5Util.MD5(signStr)方法如下
public final static String MD5(String s) { char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
byte[] btInput = s.getBytes();
MessageDigest mdInst = MessageDigest.getInstance("MD5");
mdInst.update(btInput);
byte[] md = mdInst.digest();
int j = md.
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i & i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 &&& 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
return new String(str); } catch (Exception e) {
e.printStackTrace();
服务端基本这么多
前端被微信和我自己挖了大坑,整整搞了两天,擦
先是看的微信文档jssdk文档(开始埋坑。。)
页面引入js
wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '${appid}', // 必填,公众号的唯一标识 timestamp: '${timestamp}', // 必填,生成签名的时间戳 nonceStr: '${nonceStr}', // 必填,生成签名的随机串 signature: '${signature}',// 必填,签名,见附录1 jsApiList: [
'chooseWXPay' ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
嗯。配置好了。如果传入jsconfig的参数。。。
然后看到jssdk里面有发送一个微信支付请求?
function pay(){
wx.chooseWXPay({
timestamp: ${paytimestamp}, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '${paynonceStr}', // 支付签名随机串,不长于 32 位
package: '${paypackage}', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType: '${paysignType}', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '${paySign}', // 支付签名
success: function (res) {
alert("支付成功");
// 支付成功后的回调函数
然后发布,执行调试。。尼玛。怎么样都支付不了。一会儿报订单信息错误、一会儿报签名错误。。。找了N多资料均不对
后来想啊。大不了用商户平台提供的文档写接口什么的。于是加入了代码
function onBridgeReady(){WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId" : "${appid}",
//公众号名称,由商户传入
"timeStamp":"${paytimestamp}",
//时间戳,自1970年以来的秒数
"nonceStr" : "${paynonceStr}", //随机串
"package" : "${paypackage}",
"signType" : "${paysignType}",
//微信签名方式:
"paySign" : "${paySign}" //微信签名
function(res){
alert(res.err_msg);
// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返
function pay2(){
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); }else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);}
onBridgeReady();
发布调试。。。还是不对。。两个按钮pay()和pay2()均不对。pay方法还是一会儿订单信息错误一会儿签名错误。pay2()方法则一直报签名错误。。。尼玛。吧经历放后台签名。。怎么改都不行。签名明明对的啊。可以获取prepayid的。为毛封装h5参数时就出错了呢。。。折腾啊。。。搞了N久。。就尼玛不对。。。后来一个小错误pay方法js报错了。。结果pay2方法确可以执行了。。。吧pay的js报错去了之后pay2又不能用了。。我擦。。哥有预感。。难道两种方式冲突了??于是我把config和pay方法删除了再试试。。。尼玛果然可以了。不能加入config和pay。。。果然可以了。。。我擦。折腾的。。微信啃爹啊。第一种方式无法用有没有,误导人啊。。。正确结果就是商品平台的文档使用方法js如下:
function onBridgeReady(){WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId" : "${appid}",
//公众号名称,由商户传入
"timeStamp":"${paytimestamp}",
//时间戳,自1970年以来的秒数
"nonceStr" : "${paynonceStr}", //随机串
"package" : "${paypackage}",
"signType" : "${paysignType}",
//微信签名方式:
"paySign" : "${paySign}" //微信签名
function(res){
alert(res.err_msg);
// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返
function pay(){
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); }else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);}
onBridgeReady();
至此。终于把微信支付搞定了。留着博客。防止后人走弯路(config里面不能加入chooseWXPay方法。。切记)
本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程
转载请注明本文标题:本站链接:
分享请点击:
1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
阅读(5642)
没有代价的安逸未必是幸福。
手机客户端
,专注代码审计及安全周边编程,转载请注明出处:http://www.codesec.net
转载文章如有侵权,请邮件 admin[at]codesec.net招商银行手机支付NP4004支付失败是怎么回事_百度知道
招商银行手机支付NP4004支付失败是怎么回事
我有更好的答案
我们帮您进一步判断您好,烦请您提供您看到系统上的报错,需要进一步核实报错才能判断://forum!感谢您对招商银行的关注与支持.cmbchina。若您不是该报错.com/cmu/icslogin?from=B&logincmu=0进行咨询,若报错支付请求处理失败,若是一卡通手机支付出现这个报错。这个报错不排除是支付密码错,欢迎登录在线客服
网络问题!关闭在重进试试
网络,网关问题,代码失效…!
其他类似问题
为您推荐:
招商银行的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
作者:know@more
字体:[ ] 类型:转载 时间:
这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵);这会难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些“暗坑”能不掉就不掉吧,要不然关键时刻出问题,真是让人急的焦头烂额
这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵);这会儿难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些“暗坑”能不掉就不掉吧,要不然关键时刻出问题,真是让人急的焦头烂额。
&双12客户的商城活动正在蓄势进行中,却有用户频频反馈说:支付不了,有问题,并截图如下:
当时问题感觉很奇怪,自己测试多次都ok啊,问题来了都赶紧解决吧,最终找到解决办法:
原因是程序中一个字符串变量被错误的设置为数字类型,解决方法很简单,只需要给其加上双引号即可
打开WxPay.JsApiPay.php这个文件
把 $jsapi-&SetTimeStamp($timeStamp);
修改成$jsapi-&SetTimeStamp("$timeStamp");
还有一点需要提醒的是:由于微信公众号支付要通过网页授权获取用户信息,所以发起支付的页面地址不能有参数,否则会提示:returnurl不存在。
好了,这也是我个人的解决办法,有好的解决方案,欢迎各位亲提出,共同学习进步,谢谢!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具网页支付(公众号)常见问题选择字号:
网页支付JSAPI即公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。
应用场景有:
1、用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付。
2、用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付。
3、将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付 。
网页支付(JSAPI)
“当前公众号没有权限支付本次交易“
检查该公众帐号是否已经获取了支付资格。
“公众帐号支付使用了无效的商户号,无法发起该笔交易”
检查商户号使用错误。
“该公众号支付签名无效,无法发起该笔交易”
调起支付MD5签名的MD5签名错误,请检查相关签名。
“Args Error”
提交JS时,josn传递参数必须与文档中名字一致,大小写匹配。
“access:not_allow”
未设置白名单,添加位置:微信公众平台=》微信支付=》开发配置
点击支付无反应
支付授权目录是否正确,如果使用的是支付测试目录,是否设置了白名单,需白名单帐号进行支付测试。
ios系统可以正常支付,android系统支付失败
timestamp字段值需要加上“”,传递数据必须为字符串类型。
调用报错get_brand_wcpay_request:fail
签名错误,请仔细检查签名。
调用报错:zhgj-2014+中涵国际分销商城及“订单满送红包无法送”
商户设置有问题。
IOS系统调用支付JSAPI报错缺少参数:$key0$,android 没问题
提交的参数有问题,注意全部参数都得是字符串类型。
支付验证签名失败
签名错误,仔细检查签名。
jsapi 缺少参数 key0
问题出在网页端调起支付API接口中timeStamp参数,必须是string类型,但是php默认生成的时间戳是int类型。解决方法:修改下lib/Wxpay.Data.php约2731行处SetTimeStamp方法,修改为$this-&values['timestamp'] = (string)$
安卓手机可以收到满送红包 苹果的不行 红包虽然已经显示发送了红包但是实质资金流水没有扣除资金
参数错误,请仔细检查。
调用报错:传输参数错误
推测为提交的支付请求参数不正确;以下文档有详细的参考。https://pay./wiki/doc/api/jsapi.php?chapter=7_7
调用报错:没有获取到微信支付预支付ID,请管理员检查微信支付配置项
需要按照文档要求 ,先获取prepay_id。
支付权限检查失败
商户所用的参数对应的APPID是APP支付;如果商户想要JSAPI支付,需要在公众平台申请公众号,公众号支付中才有此参数。
都适用与哪些场景?展开收起
以上信息是否已解决您的问题?}

我要回帖

更多关于 没有jsapi支付权限 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信