我们在App移动开发中,支付功能基本都会遇到。前几天公司项目中有微信支付的功能,特此记录一下。本文基于AndroidStudio进行开发的。
第1步 阅读官方文档
微信官方文档
通过文档,我们要申请微信开发者平台(和微信公众号要区别),对开发者资质进行认证。还有重要一点交费!!!
第2步 填写App基本信息,获取APPID
填写App信息时候,要注意下面几点:
应用包名要保持一致.
要确定填写应用包名和App项目配置文件AndroidManifest.xml中声明的package值、项目中build.gradle文件中applicationId都保持一致。
应用签名:32位的md5串(数字小写)
可以用微信签名工具获取md5值,也可以用keytool 命令进行编译查看md5值。重要一点:该处填写 release签名(后缀名.jks)。
请注意以上2点,否则,会导致调起支付报errCode=-1.
第3步 熟悉支付流程
具体看微信业务交互时序图,可以更好理解支付整个流程和逻辑。
第4步 支付SDK依赖
- 在build.gradle文件中,添加如下依赖即可:
//下面依赖根据业务需要,任选其一
dependencies {
//包含统计功能
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
//不包含统计功能
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
- 权限配置
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
第5步 配置AS工程
在项目中增加一个wxapi包名,同时必须有WXPayEntryActivity这个类名,否则无法调起微信支付。建议:WXPayEntryActivity直接从demo中copy过来,减少不必要的麻烦。同时,包名的路径和AndroidManifest.xml文件中WXPayEntryActivity配置如图:
第6步 支付请求代码
- 注册appId
在需要调起支付Activity的onCreate()方法中进行注册appId.
IWXAPI wxApi= WXAPIFactory.createWXAPI(context, null);
wxApi.registerApp(appId);
- 发起支付
public void getWXpayOrderInfo(WXPayBean wxPayBean) {
PayReq req = new PayReq();
//wxPayBean是根据服务器返回json数据生成bean实体对象
req.appId = wxPayBean.getAppid();
req.partnerId = wxPayBean.getMch_id();
req.prepayId = wxPayBean.getPrepay_id();
req.nonceStr = wxPayBean.getNonce_str();
req.timeStamp = String.valueOf(wxPayBean.getTimestamp());
req.packageValue ="Sign=WXPay";
req.sign =CommonUtils.getSign(wxPayBean,req.timeStamp);
//发起支付请求
wxApi.sendReq(req);
}
注意: sign值 服务器端应该如下规则进行加密:
签名算法调起支付接口参数说明
第7步 WXPayEntryActivity配置
public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = App.getWXApi();
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp resp) {
if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK://成功
break;
case BaseResp.ErrCode.ERR_USER_CANCEL://取消支付
break;
case BaseResp.ErrCode.ERR_COMM:// -1
break;
}
}
}
}
至此,支付接入流程已完成了。
支付接入注意点
微信开放平台签名的问题
只要你手机上的程序的签名和你在微信平台登记的签名一致即可,无论是debug版本,还是release版本都可以调起支付成功。如果你使用debug签名,记得正式上线的时候,去微信开发平台改成release版本的签名(可能需要一段时间才会生效)。如果你使用release签名,不需要测试支付功能打包,在bulid.gradle文件加如下代码:
微信支付同一订单不会第二次跳到支付页面 提示支付失败,同一订单第二次支付的时候直接在请求遇支付订单的时候就会返回preayid为null。
- 微信支付同一订单只能绑定一个价格,如果已经生成过则获取到的prepareid为null ,不可以调起支付。