每当我集成一个第三方的东西的时候,我习惯把过程写下来,这样不管是留给后人还是以后自己再遇到的是都可以再翻翻看。
1.官方demo 下载下来,跑一一遍支付成功了,然后再重试,先获得token,通过,可是跳转的时候提示“返回-1”。你大爷我什么都没改好不好?(另外,可见微信支付SDK一点也不智能,给我这个提示鬼知道是什么错误啊!)这个是keystore问题,替换下key,id改下keystore文件即可。
2. 五个重要参数:PARTNER_KEY,APP_SECRET,APP_KEY,APP_ID,PARTNER_ID。只有一个APP_SECRET没有替换,然后获取token就出错了。提示:“获取assces_token出错,原因ERR_JSON”。我擦。仔细翻代码,发现APP_SRCRET错了!ok!把APP_SECRET替换掉之后通过。
3. 然后,妈蛋,token获取成功了,获取预付订单的时候,提示“获取prepayid失败,原因ERR_JSON”。log如下:doInBackground, content = {"errcode":77523001,"errmsg":"签名错误"}
-----好了,发现我走投无路了。-----那么开始分析一下原因,这里提示是json错误!根据以前集成支付宝的时候的经验,可以推断如下原因:a.key的不对,b.包名不对,c.我这里的订单号是之前用过的了,妈蛋微信是不可能让你个大傻X重复支付的。d.是我RP不行!
4.仔细看下:发现订单号是随机生成的,排除d。PayActivity.class339行 "partner" 这里他们的demo竟然是写死的卧槽。草泥马。 改Constants.PARTNER_ID 好了。
5.然后运行通过上面的问题了。报错 冷尼玛 这个错误是什么吊东西 。什么都没有好吗? {"errcode":1001,"errmsg":""}
6。谷哥一下,发现 total_fee 这个我给改成0.01是不对的。好吧!根据我做支付宝的概念,1是1元,不是1分,而微信是的。然后改回来之后发现跳转到支付页面了。如图:
7.支付完成,想一下逻辑。妈蛋不对劲,按照支付宝的流程,支付完成应该有个回调的,来通知我已经支付完成了。可是没有回调成功,我擦你大爷的。 百度上谷歌了一下,发现了这个贴了 http://fangjie.info/?p=393 。
微信开放平台有个 不成文的规定(文档里没有说明),就是回调的Activity必须是:你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXPayEntryActivity.java
哎呀!我操!这就是鹅厂的作风。你妹。我辣油厂要干掉鹅厂!回调不成功的问题就是需要加一个.wxapi.WXPayEntryActivity。
8.根据上面这个帖子我发现还是不能成功,添加如下代码到Mainfast里面就行了。
所以我需由于我不想写在同一个Activity中,所以我重新写了一个页面,但是我又不想给用户看到新开了一个页面。所以,我弄了一个半透明的style。@style/TransparentActivity
OK! 客户端流程走完了,那么接下来就是要为了做安全性设计,把一些重要的东西放到服务器生生成,这样是为防止客户端被反编译。反编译之后,带来的就是别人拿到key 模拟支付过程,把某个订单号支付完成。那么,腾讯那边收到钱就会同时给客户端 和我们自己的服务器发送请求。那么,我们自己的服务器收到腾讯的通知之后,就会把这个订单的状态置为已经支付。呵呵!说的蛮顺嘴的,你听懂了吗 ?就是因为订单信息在我们的服务器上,腾讯不知道订单的价格,他只管收钱就行了。也就是支付的时候100元的订单,修改价格为1元之后,也可以支付成功。问题就在这里。
官方的代码里面 是建议genPackage 这个方法在服务端生成。这里只是一个签名在服务端生成。 那么依据之前做支付宝的逻辑,签名和一堆body什么字段都在服务端生成吧!所以我跟做服务器的说,这个方法genProductArgs()。也在服务端生成吧。这样我什么都不管。
PS: genProductArgs的时候,发现很多key,id都返回回来了仔细想想发现微信在保护的不过是PARTNER_KEY。
我这边支付都走通了之后,就是跟web人员交流一些东西在服务端生成的啦!因为安全性的问题,很多东西不得不在服务端生成。接下来是服务端遇到的问题1. 老是提示签名错误,和上面的代码一样的。后来web开发人员,发现是他的文件编码还有字节流编码。官方的的里,有个UTF-8 大小写的问题。2.后来还是出错,发现body里不能用特殊字符,“<_ ,”等字符都不行的 。
//PS:总结微信支付流程1.启动异步线程GetPrepayIdTask,用httpGet方式,获得临时token。2.把获得的token传给GetPrepayIdTask线程。3.genProductArgs
服务器给我这么一堆代码{ "dataMap": { "appid": "wxd1d8a8d23dc5384784", "noncestr": "69b4fa3be19bdf400df34e41b93636a4", "package": "Sign=bank_type=WX&body=%E8%A3%85%E7%94%B5%E8%84%91%E7%B3%BB%E7%BB%9F%7C&fee_type=1&input_charset=UTF-8¬ify_url=http%3A%2F%2F114.215.204.15%3A8080%2Fayly_web%2FencryptService%2FmicroMsgReturn.action&out_trade_no=1103065596&partner=1226772201&sign=EEE51959D223FA8232EE4D6FE58404209C&spbill_create_ip=121.237.253.44&total_fee=1", "partnerid": "1226772201", "prepayid": "120001000015340109f63edb1ecc3a86ce", "sign": "1869b9629fcd132ab7a491fc9f57db0bd230a3", "timestamp": "142077677" }, "desc": "取支付信息成功!", "result": 1}
我直接修改sendPayReq()方法。在sendPayReq里面掉微信就行了。安全性刚刚的!(^_^)
1.官方demo 下载下来,跑一一遍支付成功了,然后再重试,先获得token,通过,可是跳转的时候提示“返回-1”。你大爷我什么都没改好不好?(另外,可见微信支付SDK一点也不智能,给我这个提示鬼知道是什么错误啊!)这个是keystore问题,替换下key,id改下keystore文件即可。
2. 五个重要参数:PARTNER_KEY,APP_SECRET,APP_KEY,APP_ID,PARTNER_ID。只有一个APP_SECRET没有替换,然后获取token就出错了。提示:“获取assces_token出错,原因ERR_JSON”。我擦。仔细翻代码,发现APP_SRCRET错了!ok!把APP_SECRET替换掉之后通过。
3. 然后,妈蛋,token获取成功了,获取预付订单的时候,提示“获取prepayid失败,原因ERR_JSON”。log如下:doInBackground, content = {"errcode":77523001,"errmsg":"签名错误"}
-----好了,发现我走投无路了。-----那么开始分析一下原因,这里提示是json错误!根据以前集成支付宝的时候的经验,可以推断如下原因:a.key的不对,b.包名不对,c.我这里的订单号是之前用过的了,妈蛋微信是不可能让你个大傻X重复支付的。d.是我RP不行!
4.仔细看下:发现订单号是随机生成的,排除d。PayActivity.class339行 "partner" 这里他们的demo竟然是写死的卧槽。草泥马。 改Constants.PARTNER_ID 好了。
5.然后运行通过上面的问题了。报错 冷尼玛 这个错误是什么吊东西 。什么都没有好吗? {"errcode":1001,"errmsg":""}
6。谷哥一下,发现 total_fee 这个我给改成0.01是不对的。好吧!根据我做支付宝的概念,1是1元,不是1分,而微信是的。然后改回来之后发现跳转到支付页面了。如图:
7.支付完成,想一下逻辑。妈蛋不对劲,按照支付宝的流程,支付完成应该有个回调的,来通知我已经支付完成了。可是没有回调成功,我擦你大爷的。 百度上谷歌了一下,发现了这个贴了 http://fangjie.info/?p=393 。
微信开放平台有个 不成文的规定(文档里没有说明),就是回调的Activity必须是:你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXPayEntryActivity.java
哎呀!我操!这就是鹅厂的作风。你妹。我辣油厂要干掉鹅厂!回调不成功的问题就是需要加一个.wxapi.WXPayEntryActivity。
8.根据上面这个帖子我发现还是不能成功,添加如下代码到Mainfast里面就行了。
<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop" android:configChanges="keyboardHidden|orientation" android:screenOrientation="portrait" android:theme="@style/TransparentActivity" ><!--设置为 singleTop 你懂得 --> </activity>
所以我需由于我不想写在同一个Activity中,所以我重新写了一个页面,但是我又不想给用户看到新开了一个页面。所以,我弄了一个半透明的style。@style/TransparentActivity
OK! 客户端流程走完了,那么接下来就是要为了做安全性设计,把一些重要的东西放到服务器生生成,这样是为防止客户端被反编译。反编译之后,带来的就是别人拿到key 模拟支付过程,把某个订单号支付完成。那么,腾讯那边收到钱就会同时给客户端 和我们自己的服务器发送请求。那么,我们自己的服务器收到腾讯的通知之后,就会把这个订单的状态置为已经支付。呵呵!说的蛮顺嘴的,你听懂了吗 ?就是因为订单信息在我们的服务器上,腾讯不知道订单的价格,他只管收钱就行了。也就是支付的时候100元的订单,修改价格为1元之后,也可以支付成功。问题就在这里。
官方的代码里面 是建议genPackage 这个方法在服务端生成。这里只是一个签名在服务端生成。 那么依据之前做支付宝的逻辑,签名和一堆body什么字段都在服务端生成吧!所以我跟做服务器的说,这个方法genProductArgs()。也在服务端生成吧。这样我什么都不管。
PS: genProductArgs的时候,发现很多key,id都返回回来了仔细想想发现微信在保护的不过是PARTNER_KEY。
我这边支付都走通了之后,就是跟web人员交流一些东西在服务端生成的啦!因为安全性的问题,很多东西不得不在服务端生成。接下来是服务端遇到的问题1. 老是提示签名错误,和上面的代码一样的。后来web开发人员,发现是他的文件编码还有字节流编码。官方的的里,有个UTF-8 大小写的问题。2.后来还是出错,发现body里不能用特殊字符,“<_ ,”等字符都不行的 。
//PS:总结微信支付流程1.启动异步线程GetPrepayIdTask,用httpGet方式,获得临时token。2.把获得的token传给GetPrepayIdTask线程。3.genProductArgs
服务器给我这么一堆代码{ "dataMap": { "appid": "wxd1d8a8d23dc5384784", "noncestr": "69b4fa3be19bdf400df34e41b93636a4", "package": "Sign=bank_type=WX&body=%E8%A3%85%E7%94%B5%E8%84%91%E7%B3%BB%E7%BB%9F%7C&fee_type=1&input_charset=UTF-8¬ify_url=http%3A%2F%2F114.215.204.15%3A8080%2Fayly_web%2FencryptService%2FmicroMsgReturn.action&out_trade_no=1103065596&partner=1226772201&sign=EEE51959D223FA8232EE4D6FE58404209C&spbill_create_ip=121.237.253.44&total_fee=1", "partnerid": "1226772201", "prepayid": "120001000015340109f63edb1ecc3a86ce", "sign": "1869b9629fcd132ab7a491fc9f57db0bd230a3", "timestamp": "142077677" }, "desc": "取支付信息成功!", "result": 1}
我直接修改sendPayReq()方法。在sendPayReq里面掉微信就行了。安全性刚刚的!(^_^)