现在app最流行微信支付,支付宝支付,都是大部分消费类型app计费方式首选。现在5分钟教你接入微信支付。
接入前请准备好
- 微信appid
- 微信appkey
- 微信商户id
- 微信商户APIkey 需要在商户后台自定义32位key
- 上传app的签名.jks文件 MD5值
配置项目配置文件
首先,把demo中的libammsdk.jar加入项目中libs文件夹,右击as library
AndroidManifest.xml加入权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
注册广播接收器
<receiver
android:name="包名.AppRegister">
<intent-filter>
<action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" />
</intent-filter>
</receiver>
注册支付结果回调actiivty ,此处activity命名规则必须是包名+wxapi.WXPayEntryActivity ,否则无法得到支付结果。
<activity
android:name="包名.wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
在调用微信支付的activity 的intent-filter标签加上
<data android:scheme="微信appid"/>
调用支付方法
前提,微信生成预订单prepay_id要在app服务器完成,这样子好处是客户端不保存微信appkey,商户key,商户id等信息让支付更加安全可靠。操作就是客户端把商品名称,金额提交给app服务器返回预订单。
在调用支付方法view定义
private PayReq mReq
private IWXAPI mWxapi
@Override
protected void onCreate(Bundle savedInstanceState) {
mReq=new PayReq();
mWxapi=WXAPIFactory.createWXAPI(this,null);
}
public void pay(){
//判断微信是否安装
if(!isSupportPay()){
return;
}
//向app服务器提交商品名金额,获取预订单,商户id,加密信息,时间戳等后...
mReq.appId = "appid";
mReq.partnerId = "mch_id";
mReq.prepayId = "prepay_id";
mReq.packageValue = "Sign=WXPay";
mReq.nonceStr ="nonce_str";
mReq.timeStamp = "TimeStamp";
mReq.sign = "signParams";
mWxapi.registerApp("appid");
mWxapi.sendReq(req);//拉起微信支付界面
}
private boolean isSupportPay(){
if(mWxapi.isWXAppInstalled()&&mWxapi.isWXAppSupportAPI()){
return true;
}else{
Toast.makeText(mContext, "请安装最新版微信", Toast.LENGTH_SHORT).show();
return false;
}
}
WXPayEntryActivity.java
private IWXAPI wxapi;
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
@Override
protected void onCreate(Bundle savedInstanceState) {
wxapi = WXAPIFactory.createWXAPI(this, "wxappid");
wxapi.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
wxapi.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
// TODO Auto-generated method stub
}
//微信通知app客户端
@Override
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
switch(resp.errCode){
case 0:
//支付成功
break;
case -1:
//未签名app
break;
case -2:
//取消支付
break;
default:
//支付失败
break;
}
}
}
}
支付相关错误码
如果resp.errCode返回-1,此时app签名和微信open平台签名文件的md5值不一致造成,所以要确保app使用open平台相同签名文件。
如遇到其他复杂情况可以清空微信app缓存,进行测试。