[TOC]
客户端微信支付
android 接入微信指南
android 资源下载页
微信支付 开发文档
- 登录微信官方开放平台微信,注册账号,在微信开放平台申请应用,输入已上线app的正式的应用包名和签名,微信提供了一个签名工具,一般使用它提供的签名工具生成签名,然后填写到对应的位置。。android微信接入指南,对于微信支付,还需要用户单独申请微信支付的功能,填写信息,签约等等。。
- 准备完成之后,会获取到相应的appId appSecret 商户秘钥,商户Id等。。APP支付接入指南
需要注意的一点是,微信支付分为好几种扫描支付 公众号支付 app支付等,但是他们并不一样,公众号支付和扫码支付是在公众号注册用户,申请支付,而APP支付是在微信开放平台进行申请的。。请不要搞混乱,我因此乱了两周了。。。 - 一切准备完毕,接下来就进入正式的开发,我们的流程是,客户端预定商品,服务器生成订单号OrderId,然后根据此订单号,由服务器去统一下单,生成预支付订单,然后由服务器把需要调起支付页面的7个参数通过json格式传给客户端。。
{
"package": "Sign=WXPay", 包名
"timestamp": 1476092570, 随机时间
"sign": "6960633xxxxxxxx7F6FA1EFxxxxx2D72", 签名
"partnerid": "13xxxxxx1", 商户id
"appid": "wxxxxxxxxxx4e7d", appid
"prepayid": "wx201610xxxxxxxx0663390994", 预支付订单号
"noncestr": "36a0de4b95314703881d051668a8" 随机字段值
}
- 接下来就是客户端对微信端的工作了。。下载微信SDK ,然后添加到项目中。。或者使用build导入的形式
- 跟微信登录和分享是一样的,同样在包名下新建一个package - 包名.wxapi,在这个新包下创建两个类,WXPayEntryActivity,WXEntryActivity,这两个类主要是用来获取微信支付,微信登录分享之后的回调。。还需要在配置文件下对此类进行声明,主要是说明能够让外部引用。。 android:exported="true"
<activity
android:name=".wxapi.WXPayEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
</activity>
- 下面是配置微信登录分享的信息
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
- 配置也配置好了,接下来就是在对应的类中的onResp()方法中,对返回的errorCode进行解读,不同的code代表不同的意思。。
switch (resp.errCode) {
case 0:
result = "支付成功!!!";
break; //支付成功
case -1:
result = "支付失败!!!";
break; //支付失败
case -2:
result = "取消支付!!!";
break; //取消支付
}
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
AlertDialog.Builder builder = new AlertDialog.Builder(WXPayEntryActivity.this);
builder.setMessage(getString(R.string.pay_result_callback_msg, result));
builder.setTitle("支付结果");
builder.setPositiveButton(WXPayEntryActivity.this.getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, int which) {
dialog.dismiss();
WXPayEntryActivity.this.finish();
}
});
builder.create().show();
}
- 一切准备完成,下面就是发送支付请求,调起支付界面了。。
由于是服务器把所有的参数都准备好,所以只需要解析服务器数据即可。。
但是在发送微信请求之前需要根据appid创建IWxapi,然后注册。。。一般使用全局的wxapi实例,所以可以在Application中对微信进行注册。。
IWapi wxapi = WXAPIFactory.createWXAPI(this, Constants.SOCIAL_WECHAT_APP_ID, true);
wxapi.registerApp(Constants.SOCIAL_WECHAT_APP_ID);
//根据服务器返回的数据,调起支付
PayReq req = new PayReq();
req.appId = JsonUtil.getStringValue("appid", jsonObject);
req.partnerId = JsonUtil.getStringValue("partnerid", jsonObject);
req.packageValue = "Sign=WXPay";
req.nonceStr = JsonUtil.getStringValue("noncestr", jsonObject);
req.timeStamp = JsonUtil.getStringValue("timestamp", jsonObject);
req.prepayId = JsonUtil.getStringValue("prepayid", jsonObject);
req.sign =JsonUtil.getStringValue("json", jsonObject);
Boolean sendResult = App.getContext().wxapi.sendReq(req);
- 请求发送结束之后,我们就可以在WxpayEntryActivity中对支付结果做出处理。。
errotCode有三种选择 0:正常支付 -1:支付失败 -2:取消支付 - 下面是一些判断之类的:
if (App.getContext().wxPayApi.isWXAppInstalled()) {
if (App.getContext().wxPayApi.isWXAppSupportAPI()) {
payByWechat(orderId);
} else {
App.getContext().showMessage("您当前的微信版本不支持支付");
}
} else {
App.getContext().showMessage("您还未安装微信客户端");
}
- 微信的签名很大的坑,需要要按照他的签名规则才可以。。微信签名规则