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

public interface WeChatPayCallback {
    void onWeChatPaySuccess();
    void onWeChatPayFailure();
    void onWeChatPayCancel();
}

APP

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

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

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

<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"/>

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/30/android-integrated-wechat-app-payment-notes/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Android集成微信APP支付注意事项
微信支付能成功唤起的前提是,包名与签名信息要与在微信后台配置的保持一致。以下基于微信支付Android Gradle集成方式 登录微信开放平台[https://open.weixi……
<<上一篇
下一篇>>
文章目录
关闭
目 录