Skip to content

接入微信SDK跳转微信小程序指南

hienaowork edited this page Jul 19, 2022 · 11 revisions

前置条件

  • 用户需前置接入微信SDK
  • App开店SDK版本大于等于 7.2.5

初始化配置

在初始化SDK时,需要选择配置是否已接入微信Open SDK,isWxsdkIntegrated=true时会通过微信Open SDK的方式进行跳转和回跳,isWxsdkIntegrated=false则通过 URL Scheme的方式跳转,默认为false。

YouzanSDK.init(
    context, 
    "client_id",
    "appKey", 
    // 是否集成微信SDK,若为true,则会在微信支付时,跳转微信小程序进行支付
    true, 
    new YouZanSDKX5Adapter());

处理SDK跳转微信小程序事件

在上述已配置通过微信Open SDK接入的方式下,用户在H5下单支付页面选择微信支付后,SDK会通过代理方法中 YouzanBrowser 的 AbsWxPayEvent 事件告知到开发者需要进行微信小程序的跳转,并且在response参数里携带对应跳转参数,示例代码如下:

YouzanBrowser().subscribe(new AbsWxPayEvent() {
    /**
     * 小程序调试类型
     * 	0: release
     * 	1: test
     * 	2: preview
     * 	参考 com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram.Req.MINIPTOGRAM_TYPE_RELEASE、MINIPROGRAM_TYPE_TEST、MINIPROGRAM_TYPE_PREVIEW
     */
    @Override
    public void call(Context context, WxPayModel wxPayModel) {
        Log.e(TAG, "AbsWxPayEvent:" + wxPayModel);
        WeChatUtils.INSTANCE.jumpToWechat(YouzanActivity.this, wxPayModel.getAppId(), wxPayModel.getPath(), Integer.parseInt(wxPayModel.getMiniprogramType()));
    }
});
/**
 * 跳转微信小程序
 */
fun jumpToWechat(context: Context, appId: String, path: String, miniprogramType: Int) {
    if (TextUtils.isEmpty(appId)) {
        Toast.makeText(context, "小程序id为空,请检查!", Toast.LENGTH_SHORT).show()
        return
    }
    // isWeiXinAvailable用于判断是否安装微信APP,请各自实现
    if (isWeiXinAvailable(context)) {
        // 此处wxd5735fxxxxxxxxxx请使用各自APP申请到的微信appId
        val api = WXAPIFactory.createWXAPI(context, "wxd5735fxxxxxxxxxx")
        val req = WXLaunchMiniProgram.Req()
        req.userName = appId
        if (!TextUtils.isEmpty(path)) {
            req.path = path
        }
        req.miniprogramType = miniprogramType
        api.sendReq(req)
    } else {
        Toast.makeText(context, "跳转失败,请先安装微信!", Toast.LENGTH_SHORT).show()
    }
}

处理微信小程序回跳事件

微信小程序处理支付完成以后会出现一个"返回商家"的按钮,点击后会触发微信SDK的WXEntryActivity.onResp()方法,可以在这里进行返回商家的处理,建议重新跳回店铺,并刷新支付结果页。

public class WXEntryActivity extends BaseActivity implements IWXAPIEventHandler {
    
    @Override
    public void onResp(BaseResp resp) {
        if (resp != null) {
           
            finish();
        }
    }

}

为了能返回原页面,需要检查下页面中WXEntryActivity 在manifest的声明:
在 manifest 文件里面加上exported、taskAffinity及 launchMode 属性,其中 exported 设置为true,taskAffinity设置为你的包名,launchMode设置为singleTask
下图为微信文档的示例供参考,原文链接:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html#jump2

<activity
    android:name=".wxapi.WXEntryActivity"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:exported="true"
    android:taskAffinity="填写你的包名"
    android:launchMode="singleTask">
</activity>