随着小程序的日渐火热,许多app都做了相应的小程序端,与之而来的两端交互是必不可少的,前几天我们的分享到微信的样式也要求改成了小程序卡片样式的了。其实微信的官方文档还算比较详细,我这就结合自己踩的坑给大家分享一下。
首先app分享小程序卡片需要满足以下要求:
发起分享的App与小程序属于同一微信开放平台帐号。
支持分享小程序类型消息至会话,暂不支持分享至朋友圈。
若客户端版本低于6.5.6,小程序类型分享将自动转成网页类型分享。开发者必须填写网页链接字段,确保低版本客户端能正常打开网页链接。
下面便是相应的代码:
WXMiniProgramObject miniProgramObj = new WXMiniProgramObject();
miniProgramObj.webpageUrl = "http://www.qq.com"; // 兼容低版本的网页链接
miniProgramObj.miniprogramType = WXMiniProgramObject.MINIPTOGRAM_TYPE_RELEASE;// 正式版:0,测试版:1,体验版:2
miniProgramObj.userName = "gh_d43f693ca31f"; // 小程序原始id
miniProgramObj.path = "/pages/media"; //小程序页面路径
WXMediaMessage msg = new WXMediaMessage(miniProgramObj);
msg.title = "小程序消息Title"; // 小程序消息title
msg.description = "小程序消息Desc"; // 小程序消息desc
msg.thumbData = getThumb(); // 小程序消息封面图片,小于128k 这个字节数组不能为空 否则无法调起微信页面 调试的时候可以先随便赋值一个new byte[n]
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession; // 目前支持会话
api.sendReq(req);//IWXAPI api = WXAPIFactory.createWXAPI(context, Constants.APP_ID); 这里的api是根据微信的app_id创建的
下面是getThumb()和buildTransaction()方法示例,
private static byte[] getThumb(){
byte[] thumb;
Bitmap bitmap= BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_app);
Bitmap sendBitmap=Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
thumb = BitmapUtils.bmpToByteArray(sendBitmap,true);
bitmap.recycle();
return thumb;
}
private static String buildTransaction(final String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}
到现在差不多是就完成了小程序卡片分享了,如果你想直接从app跳转小程序也是可以的,如下:
String appId = "wxd930ea5d5a258f4f"; // 填应用AppId
IWXAPI api = WXAPIFactory.createWXAPI(context, appId);
WXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req();
req.userName = "gh_d43f693ca31f"; // 填小程序原始id
req.path = path; //拉起小程序页面的可带参路径,不填默认拉起小程序首页
req.miniprogramType = WXLaunchMiniProgram.Req.MINIPTOGRAM_TYPE_RELEASE;// 可选打开 开发版,体验版和正式版
api.sendReq(req);
//WXEntryActivity中
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_LAUNCH_WX_MINIPROGRAM) {
WXLaunchMiniProgram.Resp launchMiniProResp = (WXLaunchMiniProgram.Resp) resp;
String extraData =launchMiniProResp.extMsg; // 对应JsApi navigateBackApplication中的extraData字段数据
}
}
那么从小程序跳转到app也比较简单(目前好像是只有通过以上两种方式打开小程序才能够从小程序跳转回app):
<button open-type="launchApp" app-parameter="wechat" binderror="launchAppError">打开APP</button>
Page({
launchAppError: function(e) {
console.log(e.detail.errMsg)
}
})
上面是小程序端的代码,当然,我们还需要在WXEntryActivity做一些处理,下面是具体代码,可以根据自己的实际需求进行修改
import android.content.Intent;
import android.os.Bundle;
import com.common.utils.BLog;
import com.common.utils.Constants;
import com.isea.collegedaily.wiki.activity.MainActivity;
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.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.umeng.weixin.callback.WXCallbackActivity;
//import com.umeng.socialize.weixin.view.WXCallbackActivity;
public class WXEntryActivity extends WXCallbackActivity implements IWXAPIEventHandler{
// IWXAPI 是第三方app和微信通信的openapi接口
private IWXAPI api;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(this, Constants.APP_WX_ID, false);
//注意:
//第三方开发者如果使用透明界面来实现WXEntryActivity,需要判断handleIntent的返回值,如果返回值为false,则说明入参不合法未被SDK处理,应finish当前透明界面,避免外部通过传递非法参数的Intent导致停留在透明界面,引起用户的疑惑
try {
BLog.i("--------handleIntent--------"+api.handleIntent(getIntent(), this));
if(!api.handleIntent(getIntent(), this)){
finish();
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq req) {
switch (req.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
TODO: 2018/6/20
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
TODO: 2018/6/20
startMainNoParam();
break;
default:
break;
}
}
@Override
public void onResp(BaseResp baseResp) {
BLog.i("-------------onResp-------------");
}
private void startMainNoParam(){
Intent intent=new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
如果还有什么问题,可以下载微信的官方demo进行排查
https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/WeChatSDK_sample_Android.zip