Android集成微信APP支付注意事项

微信支付能成功唤起的前提是,包名与签名信息要与在微信后台配置的保持一致。以下基于微信支付Android Gradle集成方式

  1. 登录微信开放平台[https://open.weixin.qq.com ,配置好应用[包名、签名等],给应用开通微信支付能力,然后交钱,等审核通过后即可调用SDK,注意申请APP前应先添加
    [应用类目]

  2. 在应用中添加微信支付的依赖[implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.6.21'],建议指定依赖的版本号,版本号可以在https://bintray.com/wechat-sdk-team/maven 查到

  1. 在项目包[也就是AndroidManifest.xml中的包]下新建wxapi包,然后在wxapi包下新建WXPayEntryActivity,此类继承自Activity,并且需要实现IWXAPIEventHandler接口,在onResp方法中处理微信支付结果[成功、失败、用户取消支付等等]。在这个步骤中需要注意的是,包名、类名一定要写正确,不然就算成功唤起微信支付,也收不到微信支付的回调。至于类名为什么要这么写,我在调用微信支付的时候,看到控制台有打印这么一行Log[MicroMsg.SDK.WXApiImplV10:pay,set wxappPayEntryClassName=com.tencent.mm.plugin.base.stub.WXPayEntryActivity]

  2. AndroidManifest.xml中注册WXPayEntryActivity,加一下微信支付需要的权限[网络、wifi之类的]

  3. 在需要使用微信支付的地方,发起微信支付请求,通过创建一个IWXAPI实例调用sendReq(PayReq req)方式即可,PayReq对象可以直接new出来,里面的属性该赋值的都附上。此处需要注意的地方,如果获取IWXAPI实例的方式是通过WXAPIFactory.createWXAPI(Context context, String appid, boolean checkSignature)的话,需要将IWXAPI的实例申明成局部变量,不然,你只能成功调起微信支付一次,再往后就调不起来了

  4. 由于微信支付回调只会回调WXPayEntryActivity中的onResp方法,在多个页面有微信支付的时候,我们可以自定义一个接口,比如WeChatPayCallback,在微信支付回调的时候调用自定义的接口方法。一般的做法是,在Application中申明一个public的WeChatPayCallback实例weChatPayCallback,在调用微信支付的Activity中implements WeChatPayCallback,并将Application中的weChatPayCallback赋值为当前Activity

WeChatPayCallback

1
2
3
4
5
public interface WeChatPayCallback {
void onWeChatPaySuccess();
void onWeChatPayFailure();
void onWeChatPayCancel();
}

APP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class APP extends Application {
private static APP instance;

@Override
public void onCreate() {
super.onCreate();
instance=this;
}

public static APP getInstance() {
return instance;
}

public WeChatPayCallback weChatPayCallback;
}

WXPayEntryActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

public static final String APP_ID = "应用在微信上申请的appId";
private IWXAPI iwxapi;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
iwxapi = WXAPIFactory.createWXAPI(this, APP_ID, false);
registerWeChatCallback();
}

private void registerWeChatCallback() {
iwxapi.handleIntent(getIntent(), this);
}

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
registerWeChatCallback();
}

@Override
public void onReq(BaseReq baseReq) {

}

@Override
public void onResp(BaseResp baseResp) {
WeChatPayCallback weChatPayCallback = APP.getInstance().weChatPayCallback;
if (ConstantsAPI.COMMAND_PAY_BY_WX == baseResp.getType()) {
if (weChatPayCallback != null) {
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_USER_CANCEL:
weChatPayCallback.onWeChatPayCancel();
break;
case BaseResp.ErrCode.ERR_COMM:
weChatPayCallback.onWeChatPayFailure();
break;
case BaseResp.ErrCode.ERR_OK:
weChatPayCallback.onWeChatPaySuccess();
break;
}
}
finish(); //建议在AndroidManifest.xml中将WXPayEntryActivity设为透明主题,否则finish后会黑屏
}
}
}

PayActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class PayActivity extends Activity implements WeChatPayCallback{

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

private void startWeChatPay() {
IWXAPI iwxapi = WXAPIFactory.createWXAPI(this, WXPayEntryActivity.APP_ID, false);
APP.getInstance().weChatPayCallback=this;

PayReq req = new PayReq();
//设置PayReq的属性,一般由后台接口返回
//像req.appId=xxx这样设置
iwxapi.sendReq(req); //此处有返回值,如果成功调起微信支付,返回true,否则返回false
}

@Override
public void onWeChatPaySuccess() {
//微信支付成功
}

@Override
public void onWeChatPayFailure() {
//微信支付失败
}

@Override
public void onWeChatPayCancel() {
//微信支付被取消
}
}

AndroidManifest.xml

1
2
3
4
5
6
7
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:name=".wxapi.WXPayEntryActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|screenSize|orientation"
android:exported="true"
android:label="@string/app_name"/>

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2021 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :