美文网首页
微信分享接入

微信分享接入

作者: 金蛇go | 来源:发表于2018-05-09 11:02 被阅读0次

    一.接入

     APP申请审核

    首先项目集成微信SDK,需要到官网注册,因为微信对第三方的调用有着严格的验证:App ID,包名,及应用签名,只有这三个跟申请的都完全匹配,才能调用分享。

    需要注意点:

    1) 应用官网那栏可以直接填写你的博客地址或其他

    2) 包名需填写你所要集成项目的包名,后续可修改

    3) 应用签名格式为小写连续,并且注意填写签名的版本

    二.搭建开发环境

    Android Studio环境下:

    在build.gradle文件中,添加如下依赖即可:

    dependencies {

    compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

    }

    dependencies {

    compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

    }

    [1] AndroidManifest.xml 设置

    添加必要的权限支持:

    manifest 权限

    三.分享集成

    3.1  接口方法类及属性

    WXMediaMessage -- 微信媒体消息内容

    mediaObject描述一个媒体对象的基类

    媒体对象包括WXTextObject,WXImageObect 等

    3.2 分享或收藏的目标场景,通过修改scene场景值实现

    发送到聊天界面 ——WXSceneSession

    发送到朋友圈 ——WXSceneTimeline

    添加到微信收藏 ——WXSceneFavorite

    3.3 集成

    要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id:

    api = WXAPIFactory.createWWXAPI(this,APP_ID,ture);// 第三个参数作用? 

    api.registerApp(APP_ID)

    Steps: > 1.

    //将要分享的内容shareContent,传给新建出来的相应类型媒体对象 

    WXTypeObject typeObj = new WXTypeObject(); // typeObj为分享内容类型

    typeObj = shareContent;// 分享内容

    >2. 初始化WXMediaMessage对象,并将带有分享内容的类型媒体对象typeObj赋值给其mediaObject属性 WXMediaMessage msg = new WXMediaMessage();

    msg.mediaObject = typeObject; 

    >3. 构造Req,并选择分享的目标场景**scene**

    SendMessageToWX.Req req = new SendMessageToWX.Req();

    req.transaction = buildTransaction("text");// 用于唯一标识一个请求

    req.message = msg;

    req.scene = SendMessageToWX.Req.WXSceneSession; 

    >4. 调用api.sendReq(req);

     api.sendReq(req);

     每个类型的分享流程大致都如上,只是需要根据具体的分享类型修改第1,2步骤

    2. 文字分享

    // 初始化一个WXTextObject对象,并填写分享的内容

    WXTextObject textObject = new WXTextObject();

    textObject.text = "textObject.text"; // 分享的内容,即对方收到的消息

    // 用WXTextObject对象初始化WXMediaMessage对象

    WXMediaMessage msg = new WXMediaMessage();

    msg.mediaObject = textObject;

    msg.description = "description"; // 分享框的title文字

    // 构造一个Req

    SendMessageToWX.Req req = new SendMessageToWX.Req(); // 用于唯一标识一个请求

    req.transaction = buildTransaction("text");

    req.message = msg;

    req.scene = SendMessageToWX.Req.WXSceneSession;// 聊天界面

    // 调用api接口发送数据到微信

    Toast.makeText(this,"" + api.sendReq(req),Toast.LENGTH_SHORT).show();

    >- 图片分享

    // 获取索要分享的图片

    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.little);

    // 初始化WXImageObject,并将图片传入

    WXImageObject imgObject = new WXImageObject(bmp);

    // 初始化WXMediaMessage对象,并将imgObj赋值给媒体对象mediaObject

    WXMediaMessage msg = new WXMediaMessage();

    msg.mediaObject = imgObject;

    Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 150, 150, true);

    bmp.recycle();

    msg.thumbData = bmpToByteArray(thumbBmp, true);

    // 构造一个Req

    SendMessageToWX.Req req = new SendMessageToWX.Req();

    req.transaction = buildTransaction("img");

    req.message = msg;

    req.scene = SendMessageToWX.Req.WXSceneSession;

    // 调用api接口发送数据到微信

    Toast.makeText(this,"" + api.sendReq(req),Toast.LENGTH_SHORT).show();

    >- 其余媒体类型可具体参照-- 微信官方文档:(分享与收藏功能开发文档)

    3. Tips: >- 注意所分享类型的限制条件,例如分享的文字及图片有大小限制,所以若图片缩略图大于32k则分享不成功。

    3.4.跳转小程序

    val miniProgramObj = WXMiniProgramObject()

    miniProgramObj.webpageUrl = "http://www.qq.com"

    // 兼容低版本的网页链接

    miniProgramObj.miniprogramType = WXMiniProgramObject.MINIPROGRAM_TYPE_PREVIEW // 正式版:0,测试版:1,体验版:2

    miniProgramObj.userName = "gh_b7a83a16c048" // 小程序原始id

    miniProgramObj.path = "pages/index/index" //小程序页面路径

    val msg = WXMediaMessage(miniProgramObj)

    msg.title = "小程序消息Title" // 小程序消息title

    msg.description = "小程序消息Desc" // 小程序消息desc

    msg.thumbData = getThumb() // 小程序消息封面图片,小于128k

    val req = SendMessageToWX.Req()req.transaction = buildTransaction("webpage")

    req.message = msgreq.scene = SendMessageToWX.Req.WXSceneSession // 目前只支持会话

    api.sendReq(req)

    3.5接收微信的请求及返回值(从小程序跳回app必须要实现)

    如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作:

    a. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类(保命,类名不可改),该类继承自Activity

    WXEntryActivity

    并在manifest文件里面加上exported属性,设置为true,例如:

    activity配置

    b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法

    c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下图:

    app接收微信回传信息

    当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。

    四. 点击微信分享的内容后跳转来源App的实现

    方案一

    从WebView(该WebView从属于另一个App,并非我们自己的App)跳转到MyApp的某个界面(这里以跳转到MyApp的Acticity A为例)。具体的实现逻辑如下:

    (1)该WebView显示的网页内容只是一个超链接,自定义了一个scheme=myapp://,后边可以附加一些参数,如果需要从网页向App传值的话。

    html配置

    (2)MyApp中的Activity A需要配置特定的infliter,如下:

    activity intent-filter配置

    (3)当在WebView上点击上述自定义的超链接时就可以打开MyApp的A界面,所传递的参数也可以在所跳转到的Activity中获取,方法如下:

    getIntent().getScheme();//获得Scheme名称  

    getIntent().getDataString();//获得Uri全部路径,根据自定义的格式解析字符串即可获取我们上面附加的参数。

    问题1:如果用户安装了MyApp,就可以点击网页跳转,如果没有安装MyApp的话,WebView就会提示找不到该页面。制作网页时可以在网页中做检测,没安装MyApp的话,页面就重定向到应用的下载页面。

    问题2:在普通App的WebView中和浏览器中上述机制是可以的,但是在微信的WebView是不可以点击直接跳转我们的应用的,可能是微信做了某些过滤,且仅仅支持跟微信有深度合作的应用的跳转,如大众点评是可以的。针对这种情况,我们可以引导用户使用浏览器打开所分享的网页,然后点击就可以跳转应用了。

    方案二

    使用微信SDK分享WXAppExtendObject数据给好友,好友点击跳转MyApp的某个页面(需要在分享时传递构造跳转Intent的参数)。

    1.该类型的分享(具体请参考微信分享SDK)可以带几个参数,参数中必须附带一些构造跳转Intent的数据。

    2.好友点击分享的内容,回调IWXAPIEventHandler接口的类的onReq方法,具体为

    ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:这种情况才会调用,此时可以取出分享时附带在参数中的一些数据,构造一个跳转Intent,调用startActivity(intent) 来打开MyApp。

    问题0:现版本无法分享App类型消息(低版本可以,微信抽风)

    问题1:该分享方式只能分享给好友,不能分享到朋友圈。

    问题2:如果好友没安装MyApp,点击微信中好友分享过来的消息后无反应,无法提醒“未安装MyApp,请下载”,因为这些逻辑要实现的话本身就是在MyApp里面写的,原本没装的话根本无法检测。

    问题3:WXAppExtendObject类型的分享,数据有大小限制,

    extInfo(String)限制2KB;

    fileData(byte[])供第三方使用的文件二进制数据,最大10M;

    filePath:(String)Local directory of the file provided for applications,本身长度最大10KB,文件大小同上,不超过10M。

    五.目前存在问题

    1.无法分享App类型消息

    分享App失败

    解决方式:用老版本的微信,新版本的微信不支持WXAppExtendObject

    疑问:但是微信分享的官方demo是可以分享app类型消息的,猜测是否微信官方对app类型消息做了过滤。

    相关文章

      网友评论

          本文标题:微信分享接入

          本文链接:https://www.haomeiwen.com/subject/vqiwrftx.html