安卓开发第三方应用微信支付与支付宝支付接入
公司应用客户端要用到支付 然后我这两天一直在弄这个。。。。 各种被坑。。。。。 百度论坛什么的 各种找。。。 没一个有用。。。 还加了几个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了 如果还运行不了 可能是微信版本太低 我之前设置了这个还是不行 然后更新了一下微信 就可以了
[](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() 两个有点象 不要弄错了 功能上的区别可以看看文档说明
啊啊啊啊啊 好烦哪 我光是弄微信支付就弄了两天 加上支付宝 弄了有三天了 虽然这么一整理好像没什么很难啊。。。。。 但是。。。。。
- Post link: https://xjp.in/2014/08/20/安卓开发第三方应用微信支付与支付宝支付接入/
- Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.