app

  1. AndroidManifest.xml

    1. <activity
    2. android:name=".wxapi.WXEntryActivity"
    3. android:exported="true"
    4. android:label="@string/app_name"
    5. android:launchMode="singleTask"
    6. android:taskAffinity="com.ais.ciss.skfcissmanage"
    7. android:theme="@style/Theme.AppCompat.NoActionBar.Transparent"/>
    8. // 必须透明主题
  2. styles.xml

    1. <!-- 透明主题 - 防止微信返回白屏 -->
    2. <style name="Theme.AppCompat.NoActionBar.Transparent" parent="@style/Theme.AppCompat.NoActionBar">
    3. <item name="android:windowNoTitle">true</item>
    4. <item name="android:windowBackground">@android:color/transparent</item>
    5. <item name="android:windowIsTranslucent">true</item>
    6. </style>
  3. 打开小程序

    1. IWXAPI api = WXAPIFactory.createWXAPI(context, Constants.APP_ID); // 填应用AppId
    2. WXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req();
    3. req.userName = "gh_baee2fe17ed4"; // 填小程序原始id
    4. //拉起小程序页面的可带参路径,不填默认拉起小程序首页,对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。
    5. String thirdAppId = "1010000000000131";
    6. String originalText = "5pe26Ze0PTIwMjAwNjE4MTUwMzU2JuS6i+S7tj3mgqjmraPlnKjnmbvlvZVV55u+566h55CG5bmz5Y+wJuaTjeS9nD3ov5jor7fnoa7orqQ=";
    7. String timestamp = "20200618150356";
    8. String hashText = "59FFC36576C8DD953F1C307C59CD685E01D8693CA7CE6F6696E9B6DF2D2F2930";
    9. String signature = "VPvodsFoWTr4mPJTIOP5tkfcELzeaYNQZQZ1uh5sTJbqc/4w2aAx0v8IrYFWgPA2yp0KoW0EqGU1hBbZY3thTg==";
    10. req.path = "pages/sign/sign?query=" + Uri.encode("appId=" + thirdAppId + "&timestamp=" + timestamp + "&originalText=" + originalText + "&hashText=" + hashText + "&signature=" + signature);
    11. Log.i(TAG, "toMini: url " + req.path);
    12. req.miniprogramType = WXLaunchMiniProgram.Req.MINIPROGRAM_TYPE_TEST;// 可选打开 开发版,体验版和正式版
    13. api.sendReq(req);
  4. 获取第三方小程序返回值 ```

import android.os.Bundle; import android.util.Log;

import com.ai.manage.core.util.JsonUtil; import com.ais.ciss.skfcissmanage.ui.base.BaseActivity; import com.ais.ciss.skfcissmanage.wx.constants.Constants; import com.fasterxml.jackson.databind.JsonNode; import com.tencent.mm.opensdk.constants.ConstantsAPI; import com.tencent.mm.opensdk.modelbase.BaseReq; import com.tencent.mm.opensdk.modelbase.BaseResp; import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram; import com.tencent.mm.opensdk.modelmsg.ShowMessageFromWX; import com.tencent.mm.opensdk.modelmsg.WXAppExtendObject; import com.tencent.mm.opensdk.modelmsg.WXMediaMessage; import com.tencent.mm.opensdk.openapi.IWXAPI; import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; import com.tencent.mm.opensdk.openapi.WXAPIFactory;

import java.io.IOException;

public class WXEntryActivity extends BaseActivity implements IWXAPIEventHandler { // IWXAPI 是第三方app和微信通信的openapi接口 private IWXAPI api; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 通过WXAPIFactory工厂,获取IWXAPI的实例 api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);

    // 注意:
    // 第三方开发者如果使用透明界面来实现WXEntryActivity,需要判断handleIntent的返回值,如
    // 果返回值为false,则说明入参不合法未被SDK处理,应finish当前透明界面,
    // 避免外部通过传递非法参数的Intent导致停留在透明界面,引起用户的疑惑
    try {
        api.handleIntent(getIntent(), this);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void onReq(BaseReq req) {
    switch (req.getType()) {
        case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
            // goToGetMsg();
            break;
        case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
            goToShowMsg((ShowMessageFromWX.Req) req);
            break;
        default:
            break;
    }
}

@Override
public void onResp(BaseResp resp) {
    int result = 0;

    // Toast.makeText(this, "baseresp.getType = " + resp.getType(), Toast.LENGTH_SHORT).show();
    // 小程序返回
    if (resp.getType() == ConstantsAPI.COMMAND_LAUNCH_WX_MINIPROGRAM) {
        WXLaunchMiniProgram.Resp launchMiniProResp = (WXLaunchMiniProgram.Resp) resp;
        String extraData = launchMiniProResp.extMsg; //对应小程序组件 <button open-type="launchApp"> 中的 app-parameter 属性
        try {
            JsonNode node = JsonUtil.parse(extraData);

            Log.i(TAG, "微信小程序返回 onResp: " + node.get("statusCode"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Log.i(TAG, "微信小程序返回 onResp: " + extraData);
        showError(extraData);
    }
    switch (resp.errCode) {
        case BaseResp.ErrCode.ERR_OK:
            // result = R.string.errcode_success;
            break;
        case BaseResp.ErrCode.ERR_USER_CANCEL:
            // result = R.string.errcode_cancel;
            break;
        case BaseResp.ErrCode.ERR_AUTH_DENIED:
            // result = R.string.errcode_deny;
            break;
        case BaseResp.ErrCode.ERR_UNSUPPORT:
            // result = R.string.errcode_unsupported;
            break;
        default:
            // result = R.string.errcode_unknown;
            break;
    }

    // Toast.makeText(this, result, Toast.LENGTH_LONG).show();
}

private void goToShowMsg(ShowMessageFromWX.Req showReq) {

    WXMediaMessage wxMsg = showReq.message;
    Log.i(TAG, "goToShowMsg: " + wxMsg.toString());
    WXAppExtendObject obj = (WXAppExtendObject) wxMsg.mediaObject;
    Log.i(TAG, "goToShowMsg: " + obj.extInfo);

    StringBuffer msg = new StringBuffer(); // 组织一个待显示的消息内容
    msg.append("description: ");
    msg.append(wxMsg.description);
    msg.append("\n");
    msg.append("extInfo: ");
    msg.append(obj.extInfo);
    msg.append("\n");
    msg.append("filePath: ");
    msg.append(obj.filePath);

    // Intent intent = new Intent(getActivity(), ShowFromWXActivity.class);
    // intent.putExtra(Constants.ShowMsgActivity.STitle, wxMsg.title);
    // intent.putExtra(Constants.ShowMsgActivity.SMessage, msg.toString());
    // intent.putExtra(Constants.ShowMsgActivity.BAThumbData, wxMsg.thumbData);
    // startActivity(intent);
    // getActivity().finish();
}

}

<a name="3t4kR"></a>
## 小程序

1. 接收参数

// 首页无需判断场景值 const SOURCE = { SCAN: 1011, // 扫描二维码 LONG_PRESS_SCAN: 1012, // 长按图片识别二维码 PHOTO_SCAN: 1013, // 扫描手机相册中选取的二维码 CISS: 1, // 来自签名小程序首页 MINI_PROGRAM: 1037, // 来自其他小程序 APP: 1069, // 来自第三方 APP HISTORY: 1090, // 来自小程序最近使用历史 OTHER: 1000 // 来自其他(h5) }

App({ onLaunch(options) { console.log(“onLaunch options”, options) this.getParam(options) }, onShow(options) { // 小程序启动,或从后台被重新打开 console.log(“onShow options”, options) this.getParam(options) }, getParam: function (options) { let scene = options.scene // todo 支付宝的问题, 无法用 options.scene 判断来自 app 还是 h5 if (scene) { console.log(“”) // 判断来源(小程序、app、h5) // 1. 小程序 // 1.1 签名小程序首页: 小程序首页扫描签名二维码, encode 二维码内容并传递给签名页面(在 pages/index/index.js 处理)

  if (scene === SOURCE.SCAN || scene === SOURCE.LONG_PRESS_SCAN || scene === SOURCE.PHOTO_SCAN) {
    // 1.2 支付宝首页: 支付宝首页扫描签名二维码, options.qrCode 获取二维码内容
    console.log("来自支付宝首页")
    // 获取关联普通二维码的码值,放到全局变量 qrCode 中
    if (options.query && options.query.qrCode) {
      this.qrCode = getUrlParam(decodeURIComponent(options.query.qrCode))
    }
  } else if (scene === SOURCE.MINI_PROGRAM) {
    // 1.3. 第三方小程序: extra
    console.log("来自第三方小程序")
  } else if (scene === SOURCE.APP) {
    // 2. app: extra
    console.log("来自第三方APP")
    if (options.query) {
      // 微信需要手动解码
      this.qrCode = getUrlParam(decodeURIComponent(options.query.query))
    }
  } else if (scene === SOURCE.OTHER) {
    // 3. h5等待确认场景
    console.log("H5待确认场景")

    // 3.1 微信公众号: 绑定 appId 到小程序首页(前往小程序首页 pages/index/index)
    // 3.2 h5: extra

  } else if (scene === SOURCE.HISTORY) {
    // 小程序最近使用历史
    console.log("来自小程序最近使用历史, 请扫码或重新进入小程序")
  } else {
    console.log("来自其他场景", scene)
  }

} else {
  console.log("无法获取微信官方场景值")
}
console.log("场景", scene)
// this.source = SOURCE[scene] // 记录来源
this.source = scene // 记录来源

} })


2. 返回app

extraData: JSON.stringify({ statusCode: 200, returnObj: “签名成功” })

```