安卓开发第三方应用微信支付与支付宝支付接入

公司应用客户端要用到支付    然后我这两天一直在弄这个。。。。 各种被坑。。。。。  百度论坛什么的 各种找。。。 没一个有用。。。 还加了几个qq群。。。。 感觉。。。 这日子没法过了。。。。。  最后还是被我整出来了。。。简直感动。。。。  我来记录一下。。。   我是写安卓的  所以不会涉及服务器端是怎么弄的。。 问我我也不知道。。。 ## **一、支付宝接口** 支付宝支付还好  没很大问题  官方文档和demo也没多大问题   就是比较难找    [点这个链接](https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId=1#ps-tabinfo-hash "AliPay快捷支付")    这个是支付宝快捷支付的页面   里面文档和demo 具体工作过程 是这样的 1. 从服务器获取相关信息  按照一定格式连接成字符串info   具体过程文档 里面蛮清楚的 2. 然后 用私钥给这个info加密   得到sign  然后把info和sign按照格式链接起来 形成 新的info  代码 ```java   info += "&sign=\"" + sign + "\"&sign_type=\"RSA\"" ; ``` 3. 最后 新开一个线程   下面这样   把那个最后获取到的info发送给AliPay这个类   运行这句的时候  然后就会跳到支付宝  这个过程好像这个线程会阻塞       mHandle是用来接收支付返回结果的  我直接抄的demo   可以再改 ```java new Thread() { public void run() { AliPay alipay = new AliPay(Main.this, mHandler); String result = alipay.pay(info); Message msg = new Message(); msg.what = RQF_PAY; msg.obj = result; mHandler.sendMessage(msg); }}.start(); Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { Result result = new Result((String) msg.obj); switch (msg.what) { case RQF_PAY: case RQF_LOGIN: Toast.makeText(Main.this, result.getResult(),Toast.LENGTH_SHORT).show(); break; default:break; } }; }; ``` 大概差不多 alipay就是这样了   官方建议  第一步和第二步最好放在服务器做  客户端获取的直接就是最终的info   这样私钥什么的不会直接暴露出来可能会安全一点 ## 二、微信支付 。。。。 这个让我很是无语阿。。。。有好几个要主要的地方 超级坑 ### 1.关于demo 死活运行不起来网上找了各种方法  也记录一下吧   说是因为包的签名不一样  编译的时候要用demo里面的keystore  我看到这个的时候  完全没看懂  反正操作过程是这样的   菜单里面 Window 里面 preference 下面设置这个  把那个demo文件夹里面有个keystore导入就可以运行demo了    如果还运行不了  可能是微信版本太低   我之前设置了这个还是不行  然后更新了一下微信 就可以了 [![QQ截图20140820005359](//blog-cdn.xjp.in/2014/08/QQ截图20140820005359.jpg)](http://blog-cdn.xjp.in/2014/08/QQ截图20140820005359.jpg) ### 2.关于开发 和alipay一样 也要获取各种数据 总共要向微信服务器请求好几次  发送订单信息什么的     最终获取到prepayid  这步也让服务器完成了  然后客户端直接拿到最终的数据发送给微信     然后签名编码各种值  文档里面也都有描述     sign是各种信息签名加密之后的东西       WXPayapi.sendReq(req) 这句是向微信发送支付的请求  WXPayapi里面有判断是否安装微信和微信是否支持微信支付的函数 可以判断一下    如果返回true 说明发送成功了  正常情况然后就会跳转到 微信支付 关键代码 ```java IWXAPI WXPayapi = WXAPIFactory.createWXAPI(Main.this, null);// 新建一个微信通信api的实例 WXPayapi.registerApp(MY_APP_ID);//向微信注册应用 让应用能在微信的附件里面显示 PayReq req = new PayReq(); req.appId = MY_APP_ID; req.partnerId = tmpJSON.getString("partnerid"); req.prepayId = tmpJSON.getString("prepayid"); req.packageValue = "Sign=WXPay"; req.nonceStr = tmpJSON.getString("noncestr"); req.timeStamp = tmpJSON.getString("timestamp"); req.sign = tmpJSON.getString("sign"); if(!WXPayapi.sendReq(req)){ Toast.makeText(Main.this, "请求发送失败",Toast.LENGTH_SHORT).show(); } ``` 但是  坑来了!!!  巨坑啊!!  支付完成后 它不跳转回到原来的activity!!!!   比如说  你的package的名称是 com.mypackage 那么  它会 com.mypackage.wxapi 这个包下面的WXPayEntryActivity这个activity里面!!!!这个和iso端差的有点大额。。。。。。 所以 必须要新建这个包和这个类。。。。天坑那。。。。文档里面没有写这个 但是在开发平台里面的接入说明里面写了这个。。。。。   具体代码demo里面有  略改一下就可以了    支付完成后 不管成功不成功  都会调用这个类里面给IWXAPI设置好的IWXAPIEventHandler的onResp()方法   注意!!!不是onReq()  两个有点象  不要弄错了   功能上的区别可以看看文档说明 啊啊啊啊啊 好烦哪   我光是弄微信支付就弄了两天 加上支付宝 弄了有三天了  虽然这么一整理好像没什么很难啊。。。。。 但是。。。。。