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

公司应用客户端要用到支付 然后我这两天一直在弄这个。。。。 各种被坑。。。。。 百度论坛什么的 各种找。。。 没一个有用。。。 还加了几个qq群。。。。 感觉。。。 这日子没法过了。。。。。 最后还是被我整出来了。。。简直感动。。。。 我来记录一下。。。 我是写安卓的 所以不会涉及服务器端是怎么弄的。。 问我我也不知道。。。

一、支付宝接口

支付宝支付还好 没很大问题 官方文档和demo也没多大问题 就是比较难找 点这个链接 这个是支付宝快捷支付的页面 里面文档和demo

具体工作过程 是这样的

  1. 从服务器获取相关信息 按照一定格式连接成字符串info 具体过程文档 里面蛮清楚的
  2. 然后 用私钥给这个info加密 得到sign 然后把info和sign按照格式链接起来 形成 新的info 代码
1
info += "&sign=\"" + sign + "\"&sign_type=\"RSA\"" ;
  1. 最后 新开一个线程 下面这样 把那个最后获取到的info发送给AliPay这个类 运行这句的时候 然后就会跳到支付宝 这个过程好像这个线程会阻塞 mHandle是用来接收支付返回结果的 我直接抄的demo 可以再改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

2.关于开发

和alipay一样 也要获取各种数据 总共要向微信服务器请求好几次 发送订单信息什么的 最终获取到prepayid 这步也让服务器完成了 然后客户端直接拿到最终的数据发送给微信 然后签名编码各种值 文档里面也都有描述 sign是各种信息签名加密之后的东西 WXPayapi.sendReq(req) 这句是向微信发送支付的请求 WXPayapi里面有判断是否安装微信和微信是否支持微信支付的函数 可以判断一下 如果返回true 说明发送成功了 正常情况然后就会跳转到 微信支付

关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
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() 两个有点象 不要弄错了 功能上的区别可以看看文档说明

啊啊啊啊啊 好烦哪 我光是弄微信支付就弄了两天 加上支付宝 弄了有三天了 虽然这么一整理好像没什么很难啊。。。。。 但是。。。。。