最近在做国内外移动支付这一块,初次尝试,踩了很多坑,另外个人感觉微信支付的开发文档并不是太好,重新整理一下,以供回顾和分享:
- 微信支付的必须在Release环境下测试有效
- 微信支付/登陆必须创建名为“wxapi”的包,并在这个包下实现WXEntryActivity/WXPayEntryActivity–(登陆/支付)两个Activity,这一步demo里面会有,直接拷贝后重定义自己需要的逻辑就可以
-参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调)
net.sourceforge.simcpux 该包名必须和微信开发者平台里面注册的包名一致,在这个包名下的wxapi实现WXEn t r yActivity/WXPayEntryActivity才能实现回调 - ======以下是微信支付的几个步骤,由于开发文档里面介绍的步骤含有很多坑,所以重新整理了下完整的支付开发步骤=====
- **一.微信开发步骤说明:
https://pay.weixin.qq.com/wiki/doc/api/img/chapter8_3_1.png**
商户系统和微信支付系统主要交互说明: 步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】
步骤5:商户后台接收支付通知。api参见【支付结果通知API】
步骤6:商户后台查询支付结果。,api参见【查询订单API】
- 二.进入正式开发
1.微信开发者账号申请支付功能,通过后,导入libammsdk.jar 微信jar包
2.调起支付:从上面步骤我们可以得知,微信推荐由服务后台接口获取信息,然后调起支付,我是这么实现的
/**
* 调起支付,req的参数由服务端统一下单后传递过来
*/
public static void doWXPay(Context context) {
IWXAPI wxapi = getWXAPI(context);
PayReq req = new PayReq();
//商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID
req.appId = “appid”;
req.partnerId = "partnerid"; //商户号
req.prepayId = "prepayid"; //微信返回的支付交易会话ID
req.packageValue = "Sign=WXPay"; //暂统一填写固定值Sign=WXPay
req.nonceStr = "noncestr"; //随机字符串
req.timeStamp = "timestamp"; //时间戳
req.sign = data.sign; //签名
wxapi.sendReq(req);
}
其中,req.appId ... req.sign 七个字段都是从移动端自己服务器获取的,接口从微信后台获取
/**
* 获取api
*/
public static IWXAPI getWXAPI(Context context) {
IWXAPI api = WXAPIFactory.createWXAPI(context, APP_ID, false);
api.registerApp(APP_ID); //注册api
if(!api.isWXAppInstalled()) { //判断微信是否安装
Log.e("WXPay", "未安装微信");
}
return api;
}
3.在报名wxapi下实现WXPayEntryActivity,名称不能错——这一步也是产生支付结果回调的
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxentry);
api = getWXAPI(this);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp baseResp) {
//errCode: 0, success; -1, error; -2, cancel by user
switch (baseResp.errCode) {
case 0: //用户同意
if(baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
Log.d("WXPay", "微信支付成功");
}
break;
default:
if(baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
Log.d("WXPay", "微信支付失败");
break;
}
}
}
以上就是微信支付所需要的所有步骤和代码了,这么一看,是不是逻辑也很清晰了?其实微信支付代码总共分两步:调起支付 和 实现支付结果回调——WXPayEntryActivity, 至于统一下单,那是后台实现的,Android只要接收数据就可以.
以上是自己在做微信支付时,一开始被开发文档整懵了,最后全部梳理完了发现,其实就是这么几个步骤,希望大家能够指点交流,以便完善。