Android集成微信APP支付注意事项
微信支付能成功唤起的前提是,包名与签名信息要与在微信后台配置的保持一致。以下基于微信支付Android Gradle集成方式
-
登录微信开放平台[https://open.weixin.qq.com ,配置好应用[包名、签名等],给应用开通微信支付能力,然后交钱,等审核通过后即可调用SDK,注意申请APP前应先添加
[应用类目] -
在应用中添加微信支付的依赖[
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.6.21'
],建议指定依赖的版本号,版本号可以在https://bintray.com/wechat-sdk-team/maven 查到
-
在项目包[也就是
AndroidManifest.xml
中的包]下新建wxapi
包,然后在wxapi
包下新建WXPayEntryActivity
,此类继承自Activity,并且需要实现IWXAPIEventHandler
接口,在onResp
方法中处理微信支付结果[成功、失败、用户取消支付等等]。在这个步骤中需要注意的是,包名、类名一定要写正确,不然就算成功唤起微信支付,也收不到微信支付的回调。至于类名为什么要这么写,我在调用微信支付的时候,看到控制台有打印这么一行Log[MicroMsg.SDK.WXApiImplV10:pay,set wxappPayEntryClassName=com.tencent.mm.plugin.base.stub.WXPayEntryActivity
] -
在
AndroidManifest.xml
中注册WXPayEntryActivity
,加一下微信支付需要的权限[网络、wifi之类的] -
在需要使用微信支付的地方,发起微信支付请求,通过创建一个
IWXAPI
实例调用sendReq(PayReq req)
方式即可,PayReq
对象可以直接new出来,里面的属性该赋值的都附上。此处需要注意的地方,如果获取IWXAPI
实例的方式是通过WXAPIFactory.createWXAPI(Context context, String appid, boolean checkSignature)
的话,需要将IWXAPI的实例申明成局部变量,不然,你只能成功调起微信支付一次,再往后就调不起来了 -
由于微信支付回调只会回调
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全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论