xu-li / cordova-plugin-wechat

A cordova plugin, a JS version of Wechat SDK
1.22k stars 509 forks source link

为什么server php产生的params给支付包参数格式错误? #138

Closed match08 closed 8 years ago

match08 commented 8 years ago

https://github.com/xu-li/cordova-plugin-wechat-example/blob/master/server/payment_demo.php

为什么server php产生的params给支付包参数格式错误? 产生的参数和插件的事例参数不一致

xu-li commented 8 years ago

因为那个demo是本来写给别人的。参数还是按照插件的来(修改demo的)。

match08 commented 8 years ago

报普通错误是什么?

match08 commented 8 years ago

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";

这个是基本参数要求是吧?

xu-li commented 8 years ago

基本是参数错了(很可能是sign)。

是的。js里面传进来的就是mch_id,prepay_id等。

match08 commented 8 years ago

var params = { mch_id: '10000100', // merchant id prepay_id: 'wx201411101639507cbf6ffd8b0779950874', // prepay id nonce: '1add1a30ac87aa2db72f57a2375d8fec', // nonce timestamp: '1439531364', // timestamp sign: '0CB01533B8C1EF103065174F50BCA001', // signed string };

报的 是普通错误,我测试和你demo也提示普通错误, 我服务产生的也一样报这个错误,我想是不是其他还有什么参数,例如价格什么要传的

xu-li commented 8 years ago

你的分享功能能用么?

你可以用这个工具测试支付参数是否正确。

match08 commented 8 years ago

分享我测试了下,使用这段Wechat.share({ text: "This is just a plain string", scene: Wechat.Scene.TIMELINE // share to Timeline }, function () { alert("Success"); }, function (reason) { alert("Failed: " + reason); });

直接启动微信报了未知错误

xu-li commented 8 years ago

android的签名不对。看一下FAQ吧。

match08 commented 8 years ago

修正了签名,分享可以了,支付还是报普通错误。用你那个参数也一样。

match08 commented 8 years ago

ERROR_WECHAT_RESPONSE_COMMON = "普通错误";

xu-li commented 8 years ago

你用我发的那个工具链接测试了么?

match08 commented 8 years ago

测试了,产生结果一样

xu-li commented 8 years ago

那你可以用用那个debug的lib(https://github.com/xu-li/cordova-plugin-wechat/wiki/FAQ#debugging)。看看日志里面有什么信息

你的开发者帐号申请通过了么?有支付权限么?

match08 commented 8 years ago

申请了通过了,好谢谢你

match08 commented 8 years ago

只要下面这些参数就可以启动支付? var params = { mch_id: '10000100', // merchant id prepay_id: 'wx201411101639507cbf6ffd8b0779950874', // prepay id nonce: '1add1a30ac87aa2db72f57a2375d8fec', // nonce timestamp: '1439531364', // timestamp sign: '0CB01533B8C1EF103065174F50BCA001', // signed string };

cxh01987 commented 8 years ago

这里参数好像和官方的命名不一样, 按照哪个进行签名呢?https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_12&index=2

match08 commented 8 years ago

楼上有遇到提示“普通错误吗”?

cxh01987 commented 8 years ago

遇到了,正在解决

cxh01987 commented 8 years ago

我已经成功了, 正在给你写如何用

match08 commented 8 years ago

我也成功了,谢谢

cxh01987 commented 8 years ago

1 统一下单接口产生的正确响应需要转换才能用来签名 2 签名的时候,所有的key-val格式,key必须和官方文档https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_12&index=2保持一致 3 生成完签名后,如果不想改作者的插件,请在把签名后的返回值json对应的key改的和作者获取时使用的一致,否则请改作者源码

match08 commented 8 years ago

刚服务器返回参数执行了一下就好了

match08 commented 8 years ago

这个插件,他有几个参数修改过和官方不一致,这个要注意下

xu-li commented 8 years ago

@cxh01987 只是JS调用的时候的参数命名不一致(因为我觉得官方的太难看了)。签名等参数还是按照官方的。

看来回头我要兼容一下官方的参数格式。

hejunlong007 commented 8 years ago

我的情况也是 :“普通错误”,不过不是上面你们说的那几种情况 1.签名中的key-val中的key与官方的是一致的 2.生成的sign与生成工具生成的签名是一样的 3.js获取到这些值并且成功的传给了java那边的api 但是,我这边还是出 “普通错误”。 还有哪些需要注意的

236xzl commented 8 years ago

我在app签名和包名都对的情况下,分享报未知错误,支付报普通错误是什么情况?

Hamer-2014 commented 8 years ago

谢谢 xu li 帮我们开发了这个插件,减少了很多额外的工作。

目前已经碰到错误及解决办法,希望能给大家一些解决问题的提示:

1, 参数存在大小写不匹配, 这是我粗心导致。错误的字符串为: timeStamp(正确的为:timestamp)和 nonceStr(正确的为: noncestr)

2,  我是在服务器上生成的签名,这里面存在和插件不一致的是,在签名的时候 需要使用正确的参数

        jsApiParam.SetValue("appid", WxPayConfig.getAPPID(true));
        jsApiParam.SetValue("partnerid", WxPayConfig.getMCHID(true));
        jsApiParam.SetValue("prepayid", unifiedOrderResult.GetValue("prepay_id"));
        jsApiParam.SetValue("package", "Sign=WXPay");
        jsApiParam.SetValue("noncestr", WxPayApi.GenerateNonceStr());
        jsApiParam.SetValue("timestamp", WxPayApi.GenerateTimeStamp());
        jsApiParam.SetValue("sign", jsApiParam.MakeSign(true));

     在使用插件调用js插件中只需要用到: partnerid, prepayid, noncestr, timestamp, sign。但是生成sign的时候还是必须按照微信文档中的签名规则进行。 参数使用给出的参数列表进行签名。参考作者生成签名的方法: https://github.com/xu-li/cordova-plugin-wechat-example/blob/master/server/payment_demo.php

3, 第一次提示“参数格式错误”,解决方案为: 改成

        mch_id: '10000100', // merchant id
        prepay_id: 'wx201411101639507cbf6ffd8b0779950874', // prepay id
        nonce: '1add1a30ac87aa2db72f57a2375d8fec', // nonce
        timestamp: '1439531364', // timestamp
        sign: '0CB01533B8C1EF103065174F50BCA001', // signed string
    但是发现不是这个问题,是因为我大小写的问题导致参数格式错误。出现这个错误大家可以检查下是否存在拼写问题。或者漏写某个参数。
junhui75165 commented 7 years ago

想请教一下,我这里已经取到prepay_id后,生成的签名,但是调不起支付功能, 用的是
Wechat.sendPaymentRequest(params, function () { alert("Success"); }, function (reason) { alert("Failed: " + JSON.stringify(reason)); }); 想问一下这里有什么原因调用不了支付(分享登录功能正常,支付已审批)