xu-li / cordova-plugin-wechat-example

An example project for cordova-plugin-wechat
151 stars 115 forks source link

微信支付failed 普通错误类型 #14

Closed nbwsc closed 8 years ago

nbwsc commented 9 years ago
  var params = {
    mch_id: '1280971401', // merchant id
    prepay_id: 'wx20151106110724aa7a36a51c0292643654', // prepay id
    nonce: 'nLYur40d6aQZaRIy', // nonce
    timestamp: "1446778330", // timestamp
    sign: '2508E9C7977473C45807DCF688E407A2', // signed string
  };

我看例子中是传这几个字段,签名是重新对这些值签名对吧?时间戳有什么要求吗,为什么一直返回failed:普通错误类型。。求大神帮帮忙

nbwsc commented 9 years ago

签名是要按js的params里的这些字段签还是按照微信sdk里的那些字段签?

xu-li commented 9 years ago

签名是对整个返回值里面除签名以外的值做签名(很绕)。时间戳没特殊要求,我就用当前时间。可以看我的服务端的demo(php)

nbwsc commented 9 years ago

统一下单的签名我已经完成了,就是在app拉起微信支付时候那个签名,是要对

            req.appId = getAppId();
            req.partnerId = params.getString("mch_id");
            req.prepayId = params.getString("prepay_id");
            req.nonceStr = params.getString("nonce");
            req.timeStamp = params.getString("timestamp");
            req.sign = params.getString("sign");
            req.packageValue = "Sign=WXPay";

这个req签名还是js里调你的插件时候传的object签名?应该是对传给sdk的req签名吧?

   var params = {
    mch_id: '1280971401', // merchant id
    prepay_id: 'wx20151106110724aa7a36a51c0292643654', // prepay id
    nonce: 'nLYur40d6aQZaRIy', // nonce
    timestamp: "1446778330", // timestamp
    sign: '2508E9C7977473C45807DCF688E407A2', // signed string
  };
xu-li commented 9 years ago

一共2次签名,一次是统一下单的签名,一次是对整个返回值的签名。你看一下我的那个demo。

JS调用插件传的对object的签名就是传给微信SDK的签名,没有区别。

nbwsc commented 9 years ago

我是想问 这个sign 是

 uppercase(md5sum( "mch_id=1280971401&prepay_id=wx20151106110724aa7a36a51c0292643654&nonce=nLYur40d6aQZaRIy&...&key=xxxxxx))

还是

 uppercase(md5sum( "appId=xxxx&partnerId=wx20151106110724aa7a36a51c0292643654&partnerId=1280971401&nonceStr=nLYur40d6aQZaRIy&...&key=xxxxxx))
xu-li commented 9 years ago

对后者进行签名。见demo的第23行

后者里面几个问题:

  1. partnerId应该是prepayid? 这个你拷贝错了?
  2. 应该要按照key排序。partnerId应该在prepayid前面?见签名算法
nbwsc commented 9 years ago

恩恩,我临时拷贝的,我再仔细检查一下,应该还是签名或者参数的问题。多谢大神的耐心解答。

nbwsc commented 9 years ago

第二次sign是对appid partnerId prepayId package nonceStr timeStamp这几个字段签名对吗

xu-li commented 9 years ago

对的,但是都应该是小写。uppercase是在md5以后调用的。见调起支付

nbwsc commented 8 years ago

上周终于把微信支付弄好了,谢谢大神的耐心讲解。

litingjun2015 commented 8 years ago

xu-li, 你好:

我想请问一下运行"Send payment request"是不是一定需要那个php demo的支持? 我如果不想用php, 直接在app里实现, 应该怎么做呢? 谢谢!

xu-li commented 8 years ago

@litingjun2015 这个没试过,可能不行。你可以按照官方的文档去试试。

litingjun2015 commented 8 years ago

@xu-li 官方的文档是提供原生开发的例子吧, 我的app是基于ionic开发的, 我还不知道应该如何集成呢... 是不是把你的payment_demo.php部署起来, 参数都产生对了, 就能调起微信支付, 效果就和 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1# 的一样了? ~

xu-li commented 8 years ago

是的。

2016-04-01 11:01 GMT+08:00 litingjun2015 notifications@github.com:

@xu-li https://github.com/xu-li 官方的文档是提供原生开发的例子吧, 我的app是基于ionic开发的, 我还不知道应该如何集成呢... 是不是把你的payment_demo.php部署起来, 参数都产生对了, 就能调起微信支付, 效果就和 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1# 的一样了? ~

— You are receiving this because you were mentioned. Reply to this email directly or view it on GitHub https://github.com/xu-li/cordova-plugin-wechat-example/issues/14#issuecomment-204223656

Thanks.

Xu Li, Shanghai, China

litingjun2015 commented 8 years ago

@xu-li 我试过在ionic里调后台php的restful web service, 请问一下你这个demo是直接可以调用的吗? 还是要再封装成 restful web service? (我php不是很熟)

xu-li commented 8 years ago

不用封装就可以用。

注意: 我的那个DEMO里面的开始几个参数你要改。

On Fri, Apr 1, 2016 at 11:10 AM, litingjun2015 notifications@github.com wrote:

@xu-li https://github.com/xu-li 我试过在ionic里调后台php的restful web service, 请问一下你这个demo是直接可以调用的吗? 还是要再封装成 restful web service? (我php不是很熟)

— You are receiving this because you were mentioned. Reply to this email directly or view it on GitHub https://github.com/xu-li/cordova-plugin-wechat-example/issues/14#issuecomment-204226501

Thanks.

Xu Li, Shanghai, China

litingjun2015 commented 8 years ago

@xu-li ,

  1. 就那三个参数要改对吧
  2. 麻烦你能提供一下调用的例子吗... 谢谢~
xu-li commented 8 years ago
$.get("/payment_demo.php", function (response) {
    Wechat.sendPaymentRequest(response, function () {
        alert("Success");
    }, function (reason) {
        alert("Failed: " + reason);
    });
});
litingjun2015 commented 8 years ago

多谢~ 等我微信支付审批下来试试!

MirabelleLee commented 8 years ago

@nbwsc 你好 1.我想请问你最后二次签名时appId等字段是大写还是小写啊?我大小写都试过了,还是报普通错误。 2.我所有的数据都是通过ajax请求后台得到的,那后台返回的json数据的格式有什么要求吗? 谢谢!

forchain commented 8 years ago

找到一个场景 会重现这个错误, 且没有任何代码的问题

1 一台手机(设为A)登录微信, 然后强退(也有可能长时间没有激活, 被交换出内存了) 2 另一台手机(设为B)登录同一个微信, 因为手机A的微信进程没有运行, 所以此时仍在登录状态 3 在手机A上支付, 就出现'普通错误了'

visoon0012 commented 8 years ago

我也出现了普通错误,第一次支付的时候是可以的,第二次再支付就出现“普通错误”

huysh3 commented 7 years ago

。支付的时候弹窗:unable to pay with another account 后面是我的wxappid,有谁碰到过吗?

wanxchao commented 7 years ago

@nbwsc 老铁 我遇到和你相同的问题了 按照你们推荐的使用方法 我都一一试了 结果还是提示普通错误 希望能得到你的帮助

visoon0012 commented 7 years ago

@wangchao1002 老铁,微信支付需要验证APP的ID,是你的APP的,可以用微信官方的工具获得你的APPID,测试包和正式包的包名是不一样的。我就是这样解决的,你可以试试。

wanxchao commented 7 years ago

@visoon0012 老铁 APP的ID(是不是微信移动APP申请的那个appid)? 如果是这个的话 那我就写正确了 我微信登录,分享,这些都莫得问题 ,就一直卡在微信支付这个地方 ,希望能得到你的帮助