首页 > 代码库 > 微信支付 for android 集成笔记( 集成遇到问题记录)

微信支付 for android 集成笔记( 集成遇到问题记录)

每当我集成一个第三方的东西的时候,我习惯把过程写下来,这样不管是留给后人还是以后自己再遇到的是都可以再翻翻看。

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.class
339行     "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里面掉微信就行了。安全性刚刚的!(^_^)

微信支付 for android 集成笔记( 集成遇到问题记录)