Android集成微信分享功能采坑:分享不成功,一闪而过,无反应等情况
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android集成微信分享功能采坑:分享不成功,一闪而过,无反应等情况相关的知识,希望对你有一定的参考价值。
参考技术A android 微信分享遇到的问题:1.APP_ID是否输入正确
2.官网申请时输入的签名和打包的签名是否一致(请用微信推荐的签名工具对比)
注:微信平台填写的签名是ce187ed67e05c2d8879bf66bbfdfc8b9
是apk的keystore的md5去掉冒号,大写换位小写字母形式
3.分享一闪而过
有可能的bug:签名错误,appid正确,但是申请的时候吧包名和签名写反了
微信缓存问题,重新安装微信多试几次
4.请用微信官方提供的签名获取工具
5.自己直接run到手机运行的apk包注意签名应该和申请时用的签名一致(即把debug的签名改为release的)
6.分享图片的缩略图太大,超过32k
7.换设备,重新尝试
8.保证所有配置没有问题的情况下,尝试重启手机即可……(我没有开玩笑)
Android 三方使用之微信登录,微信分享,微信分享图片,支付
近年来三方导流,方便用户使用App,以及方便App数据分享越来越多的App支持了三方登录以及三方分享网页和图片.在此,整理了一系列三方库的集成方法以及集成中遇到的问题
一,微信配置
1:说明文档
2.资源引用
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
3.微信AndroidManifest.xml配置
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:launchMode="singleTop"
android:taskAffinity="com.mango.voaenglish"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
##注意!!!
1:WXEntryActivity,WXPayEntryActivity所处的包名必须在wxapi的指定文件夹下面 否则微信回调不执行
2:微信的回掉现在不区分成功和取消(微信SDK的问题)
3:新版本微信可能没有province或者country 请仔细查阅文档做适配
二,微信三方使用
1:微信登录
1.第一步拉起微信
//登录微信
fun loginWechat(mContext: Context)
if (isWXAppInstalledAndSupported(mContext))
Thread
val req = SendAuth.Req()
req.scope = "snsapi_userinfo"
req.state = ""
val iwxapi = WXAPIFactory.createWXAPI(mContext, APP_WECHAT_KEY, true)
iwxapi.registerApp(APP_WECHAT_KEY)
iwxapi.sendReq(req)
.start()
else
2.回调获取数据(getAccessToken() 获取token)
package com.wu.third.wxapi;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
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.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.wu.third.ThirdUtil;
import com.wu.third.wxapi.util.Constant;
import com.wu.third.wxapi.util.OkHttpUtils;
import org.json.JSONException;
import org.json.JSONObject;
/**
* 作者: 吴奎庆
* <p>
* 时间: 2018/8/23
* <p>
* 简介:
*/
public class WXEntryActivity extends Activity implements IWXAPIEventHandler
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, Constant.INSTANCE.getAPP_WECHAT_KEY(), false);
api.handleIntent(getIntent(), this);
@Override
protected void onNewIntent(Intent intent)
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
@Override
public void onReq(BaseReq baseReq)
private SendAuth.Resp resp;
@Override
public void onResp(BaseResp baseResp)
//微信登录为getType为1,分享为0
if (baseResp.getType() == 1)
//登录回调
resp = (SendAuth.Resp) baseResp;
switch (resp.errCode)
case BaseResp.ErrCode.ERR_OK:
String code = String.valueOf(resp.code);
//获取用户信息
ThirdUtil.INSTANCE.getAccessToken(code);
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED://用户拒绝授权
showMessage("用户拒绝授权");
this.finish();
break;
case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消
showMessage( "用户取消绑定");
this.finish();
break;
default:
this.finish();
break;
else if (baseResp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX)
String result = "";
switch (baseResp.errCode)
case BaseResp.ErrCode.ERR_OK:
result = "支付成功";
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = "支付取消";
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = "支付失败";
break;
default:
result = "支付失败";
break;
showMessage( result);
this.finish();
else
String result = "";
switch (baseResp.errCode)
//现阶段 取消分享以及分享成功默认返回的都是分享成功 逻辑需求请注意
case BaseResp.ErrCode.ERR_OK:
result = "分享成功";
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = "分享取消";
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = "分享失败";
break;
default:
result = "分享失败";
break;
showMessage(result);
this.finish();
private void showMessage(String message)
Toast.makeText(this,message,Toast.LENGTH_LONG).show();
String access = null;
//获取用户token
// private void getAccessToken(String code)
// String getTokenUrl = String.format("https://api.weixin.qq.com/sns/oauth2/access_token?" +
// "appid=%s&secret=%s&code=%s&grant_type=authorization_code", Constant.INSTANCE.getAPP_WECHAT_KEY(),
// Constant.INSTANCE.getAPP_WECHAT_SERECT(), code);
// OkHttpUtils.ResultCallback<String> resultCallback = new OkHttpUtils.ResultCallback<String>()
// @Override
// public void onSuccess(String response)
//
// String openId = null;
// try
// JSONObject jsonObject = new JSONObject(response);
// access = jsonObject.getString("access_token");
// openId = jsonObject.getString("openid");
// catch (JSONException e)
// e.printStackTrace();
//
// //获取个人信息
// String getUserInfo = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access + "&openid=" + openId + "";
// OkHttpUtils.ResultCallback<WeChatInfo> resultCallback = new OkHttpUtils.ResultCallback<WeChatInfo>()
// @Override
// public void onSuccess(WeChatInfo response)
// response.setErrCode(resp.errCode);
// response.setAccessToken(access);
// if (response != null) WechatLoginObservable.getInstance().update(response);
// finish();
//
//
// @Override
// public void onFailure(Exception e)
// Toast.makeText(WXEntryActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
//
// ;
// OkHttpUtils.get(getUserInfo, resultCallback);
//
//
// @Override
// public void onFailure(Exception e)
// Toast.makeText(WXEntryActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
//
// ;
// OkHttpUtils.get(getTokenUrl, resultCallback);
//
//
4:获取token
//获取用户token
fun getAccessToken(code: String)
val getTokenUrl = String.format(
"https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid=%s&secret=%s&code=%s&grant_type=authorization_code", APP_WECHAT_KEY,
APP_WECHAT_SERECT, code
)
val resultCallback: OkHttpUtils.ResultCallback<String> =
object : OkHttpUtils.ResultCallback<String>()
override fun onSuccess(response: String)
var openId: String? = null
try
val jsonObject = JSONObject(response)
access = jsonObject.getString("access_token")
openId = jsonObject.getString("openid")
catch (e: JSONException)
e.printStackTrace()
getWechatUserInfo(openId)
override fun onFailure(e: java.lang.Exception)
// todo 异常处理
OkHttpUtils.get(getTokenUrl, resultCallback)
5:获取数据
//获取微信用户信息 private fun getWechatUserInfo(openId: String?) //获取个人信息 val getUserInfo = "https://api.weixin.qq.com/sns/userinfo?access_token=$access&openid=$openId" val resultCallback: OkHttpUtils.ResultCallback<WeChatInfo> = object : OkHttpUtils.ResultCallback<WeChatInfo>() override fun onSuccess(response: WeChatInfo) response.errCode = response.errCode response.accessToken = access //获取到微信用户信息 if (response != null) WechatLoginObservable.getInstance().update(response) override fun onFailure(e: java.lang.Exception) // todo 异常处理 OkHttpUtils.get(getUserInfo, resultCallback)
2:微信分享
//微信分享
fun shareWechat(
mContext: Context,
url: String,
title: String,
desc: String,
thumbBmp: Bitmap?
)
var webpage = WXWebpageObject()
val api = WXAPIFactory.createWXAPI(mContext, Constant.APP_WECHAT_KEY)
//长度小于 10240
webpage.webpageUrl = url
//分享的内容
var msg = WXMediaMessage(webpage)
//长度限制 512
msg.title = title
//长度限制 1024
msg.description = desc
//byty[] 限制 65536 预览图
msg.setThumbImage(thumbBmp)
val req = SendMessageToWX.Req()
req.message = msg
//分享类型
req.scene = SendMessageToWX.Req.WXSceneSession
api.sendReq(req) //发送到微信
3.分享图片
fun shareWechatImg(mContext: Context, bmp: Bitmap?)
val api = WXAPIFactory.createWXAPI(mContext, Constant.APP_WECHAT_KEY)
//初始化 WXImageObject 和 WXMediaMessage 对象
val imgObj = WXImageObject(bmp)
val msg = WXMediaMessage()
msg.mediaObject = imgObj
val thumbBmp = Bitmap.createScaledBitmap(bmp!!, 120, 120, true)
bmp.recycle()
// 限制 65536 预览图
msg.thumbData = Util.bmpToByteArray(thumbBmp, true)
//构造一个Req
//构造一个Req
val req = SendMessageToWX.Req()
req.transaction = buildTransaction("img")
req.message = msg
req.scene = SendMessageToWX.Req.WXSceneSession
//调用api接口,发送数据到微信
api.sendReq(req)
fun buildTransaction(type: String?): String?
return if (type == null) System.currentTimeMillis()
.toString() else type + System.currentTimeMillis()
4:微信支付
//微信支付 数据需要后台生成预订单的时候返回支付的数据(放后台做前端不做)
fun payWechat(
mContext: Context,
appId: String,
partnerId: String,
prepayId: String,
nonceStr: String,
timeStamp: String,
packageValue: String,
sign: String,
extData: String
)
var api = WXAPIFactory.createWXAPI(mContext, Constant.APP_WECHAT_KEY);
api.registerApp(Constant.APP_WECHAT_KEY)
var req = PayReq()
req.appId = appId
req.partnerId = partnerId
req.prepayId = prepayId
req.nonceStr = nonceStr
req.timeStamp = timeStamp
req.packageValue = "Sign=WXPay"
req.sign = sign
req.extData = extData
api.sendReq(req)
有问题, 欢迎大家相互探讨.如有帮助,帮忙点个赞呗!!!
总结
1:源码地址https://gitee.com/wkqoschina/CommonProject
https://gitee.com/wkqoschina/CommonProject
以上是关于Android集成微信分享功能采坑:分享不成功,一闪而过,无反应等情况的主要内容,如果未能解决你的问题,请参考以下文章