微信分享接入

一.接入

 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类型消息做了过滤。

你可能感兴趣的:(微信分享接入)