app
AndroidManifest.xml
<activityandroid:name=".wxapi.WXEntryActivity"android:exported="true"android:label="@string/app_name"android:launchMode="singleTask"android:taskAffinity="com.ais.ciss.skfcissmanage"android:theme="@style/Theme.AppCompat.NoActionBar.Transparent"/>// 必须透明主题
styles.xml
<!-- 透明主题 - 防止微信返回白屏 --><style name="Theme.AppCompat.NoActionBar.Transparent" parent="@style/Theme.AppCompat.NoActionBar"><item name="android:windowNoTitle">true</item><item name="android:windowBackground">@android:color/transparent</item><item name="android:windowIsTranslucent">true</item></style>
打开小程序
IWXAPI api = WXAPIFactory.createWXAPI(context, Constants.APP_ID); // 填应用AppIdWXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req();req.userName = "gh_baee2fe17ed4"; // 填小程序原始id//拉起小程序页面的可带参路径,不填默认拉起小程序首页,对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。String thirdAppId = "1010000000000131";String originalText = "5pe26Ze0PTIwMjAwNjE4MTUwMzU2JuS6i+S7tj3mgqjmraPlnKjnmbvlvZVV55u+566h55CG5bmz5Y+wJuaTjeS9nD3ov5jor7fnoa7orqQ=";String timestamp = "20200618150356";String hashText = "59FFC36576C8DD953F1C307C59CD685E01D8693CA7CE6F6696E9B6DF2D2F2930";String signature = "VPvodsFoWTr4mPJTIOP5tkfcELzeaYNQZQZ1uh5sTJbqc/4w2aAx0v8IrYFWgPA2yp0KoW0EqGU1hBbZY3thTg==";req.path = "pages/sign/sign?query=" + Uri.encode("appId=" + thirdAppId + "×tamp=" + timestamp + "&originalText=" + originalText + "&hashText=" + hashText + "&signature=" + signature);Log.i(TAG, "toMini: url " + req.path);req.miniprogramType = WXLaunchMiniProgram.Req.MINIPROGRAM_TYPE_TEST;// 可选打开 开发版,体验版和正式版api.sendReq(req);
获取第三方小程序返回值 ```
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: “签名成功” })
```
