微信App支付 获取prepayid后 无法调起微信?

lizhou828 2015-06-18 02:59:38
我是做服务器端开发的。在公司的移动应用接入微信app支付是也出现了这样的问题,调起微信支付时,老是返回 -1

查阅了大量资料后,发现拿prepayid有两种方式:

第一种是看了app客户端微信支付的文档,先获取access_token,再根据access_token获取prepayid,我总是获取不到prepayid,返回{"errcode":43008,"errmsg":"require biz pay auth"}提示说app没有开通支付权限?怎么可能呢,打电话给微信支付的客服(0755-86018333)转了人工服务,帮我查了下,我的这个商户号是已经开通过微信App支付的(而且微信开放平台上的移动应用也显示已获得微信支付功能)。 这种方式果断放弃掉。。。

然后就使用第二种方式:
使用微信商户平台上的方式http://mch.weixin.qq.com/wiki/doc/api/app.php?chapter=8_1
这次是直接调用统一下单接口,type为APP类型,拿到prepayid,且对参数进行签名后,在http://mp.weixin.qq.com/debug/cgi-bin/readtmpl?t=pay/index这个地址,测试APP支付提交的接口,看是否能调起支付,结果一直是签名失败。。。。。

请问各位大神,我该怎么弄?
...全文
40850 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvqingyao520 2016-09-19
  • 打赏
  • 举报
回复
你好,请问你在开发微信app支付的时候,mch_id与商户平台的商户号是一样的吗?我用的是您的帖子里提到的第二种方法。appid填的是开放平台申请app支付应用的appid号,mch_id填的是商户平台的商户号,但老是报appid与mch_id不匹配。问了我们领导,让他看他邮件有没有mch_id,他说他没有收到邮件。故特此请教一下,审核通过后发送邮件的mch_id与商户平台的商户号是同一个吗?
刹那55 2015-10-16
  • 打赏
  • 举报
回复
你好,问下应用签名是什么东东
nixiekp 2015-08-27
  • 打赏
  • 举报
回复
你好,http://mp.weixin.qq.com/debug/cgi-bin/readtmpl?t=pay/index里面的partner_key,pay_sign_key,signature_type怎么填
lizhou828 2015-07-23
  • 打赏
  • 举报
回复
引用 3 楼 chengpen122 的回复:
请问楼主是怎么解决的,我也遇到了相同的问题。 http://mp.weixin.qq.com/debug/cgi-bin/readtmpl?t=pay/index 在这里测试提示 “获取appid的商户权限失败,请检查appid是否开通支付功能” 可是支付功能已经开通了呀 请楼主指教,谢谢啦
1、检查是否开通了微信APP支付功能,这个可以在微信开放平台中的移动应用里面查看 2、对参数进行签名时,检查appid是否填写正确 3、检查参数名的大小写是否和文档中的一致
chengpen122 2015-07-22
  • 打赏
  • 举报
回复
请问楼主是怎么解决的,我也遇到了相同的问题。 http://mp.weixin.qq.com/debug/cgi-bin/readtmpl?t=pay/index 在这里测试提示 “获取appid的商户权限失败,请检查appid是否开通支付功能” 可是支付功能已经开通了呀 请楼主指教,谢谢啦
lizhou828 2015-06-24
  • 打赏
  • 举报
回复
问题已经解决,第二种方式是对的
lizhou828 2015-06-18
  • 打赏
  • 举报
回复
有遇到过类似问题的,加我QQ376412995 或者发邮箱给我lizhou828@126.com,感激不尽!
微信 支付这 官方文档 很乱 写的 也不是很清楚,测试时 一定要与安卓 或 苹果端 一起测试。 否则 根本找不到问题。 废话 不过说 先 说说 几大坑的地方。我也是 借鉴 别人的 博客 才测试成功调起支付。文章后 直接上代码 代码 绝对能调起 微信 测试过的! 第一步,生成prepayid,这一步,只要你的appid,mch_id,key没写错,那么99%以上都能获取到prepayid,如果失败,那肯定是几个ID和key有问题,仔细检查,包括编码等,仔细仔细仔细检查。 问题来了,第二步,对获取到的prepayid进行二次签名,官方文档的坑来了,官方并没有详细说明这一步骤,一切的一切只能靠自己摸索,爬坑。 首先第一坑:参数顺序,我这里用了SortedMap,自动对参数进行asc编码顺序,一劳永逸,当然,也可以用其他map,但一定要注意参数顺序,必须是asc编码顺序。 第二坑:参数package的Sign=WXPay中=的编码问题,转码即可,小坑。 第三坑:苹果系统的timestamp位数,统一成10位即可,小坑。 第四坑:次级大坑,注意,官方文档说到的参与二次签名的参数,prepayIdappId,timeStamp等,如果你用他们的驼峰进行大写,那么你就完了。一定要小写,小写,小写。 第五坑:最大坑,一样,官方文档并没有对于二次签名有过多赘述,如果你上面几个坑完美出坑,那么,你获取到的签名sign跟官方验证的sign绝对是一样的,然而,将这些玩意丢回给APPAPP调起支付,大大的几个字出现了,验证签名失败!WTF!不要急,我已折腾了好几天,终于发现坑在哪里,那就是noncestr随机字符串,参与二次签名的随机字符串不能再次生成,注意,不能再次生成,一定要用第一步中获取prepayid时的那串字符串,一定要用第一步中获取prepayid时的那串字符串,一定要用第一步中获取prepayid时的那串字符串。 第六坑:经历了上述5坑,相信你已经有想干死人的冲动,那么你以为这就结束了吗,还有最后一坑,那就是APP签名已经包名,一定要与开放平台中的一致,然而,即使一致了你以为又结束了吗,NO,如果你更改过开放平台中的签名,并且,在更改前调用过APP微信支付,那么一定一定一定一定记得清除微信缓存。 至此,所有坑都成功出坑,终于出现了支付页面,举国欢腾,微信去年买了个表。最后附上MD5签名类
/** * 微信支付帮助库 * ==================================================== * 接口分三种类型: * 【请求型接口】--Wxpay_client_ * 统一支付接口类--UnifiedOrder * 订单查询接口--OrderQuery * 退款申请接口--Refund * 退款查询接口--RefundQuery * 对账单接口--DownloadBill * 短链接转换接口--ShortUrl * 【响应型接口】--Wxpay_server_ * 通用通知接口--Notify * Native支付——请求商家获取商品信息接口--NativeCall * 【其他】 * 静态链接二维码--NativeLink * JSAPI支付--JsApi * ===================================================== * 【CommonUtil】常用工具: * trimString(),设置参数时需要用到的字符处理函数 * createNoncestr(),产生随机字符串,不长于32位 * formatBizQueryParaMap(),格式化参数,签名过程需要用到 * getSign(),生成签名 * arrayToXml(),array转xml * xmlToArray(),xml转 array * postXmlCurl(),以post方式提交xml到对应的接口url * postXmlSSLCurl(),使用证书,以post方式提交xml到对应的接口url */ include_once("SDKRuntimeException.php"); include_once("WxPay.pub.config.php"); /** * 所有接口的基类 */ class Common_util_pub { function __construct() { } function trimString($value) { $ret = null; if (null != $value) { $ret = $value; if (strlen($ret) == 0) { $ret = null; } } return $ret; } /** * 作用:产生随机字符串,不长于32位 */ public function createNoncestr( $length = 32 ) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str =""; for ( $i = 0; $i $v) { if($urlencode) { $v = urlencode($v); } //$buff .= strtolower($k) . "=" . $v . "&"; $buff .= $k . "=" . $v . "&"; } $reqPar; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff)-1); } return $reqPar; } /** * 作用:生成签名 */ public function getSign($Obj) { foreach ($Obj as $k => $v) { $Parameters[$k] = $v; } //签名步骤一:按字典序排序参数 ksort($Parameters); $String = $this->formatBizQueryParaMap($Parameters, false)

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧