Android 三方使用之微信登录,微信分享,微信分享图片,支付

近年来三方导流,方便用户使用App,以及方便App数据分享越来越多的App支持了三方登录以及三方分享网页和图片.在此,整理了一系列三方库的集成方法以及集成中遇到的问题


微信三方

一,微信配置

1:说明文档

   文档 :  https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html

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" />

注意!!!

A:WXEntryActivity,WXPayEntryActivity所处的包名必须在

image.png

B:微信的回掉现在不区分成功和取消(微信SDK的问题)

C:新版本微信可能没有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.回调获取数据

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();
}
}
获取数据
//获取用户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)
}
    
 //获取微信用户信息
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.Android 三方使用之QQ登录,QQ图片分享,QQ分享网页

2.源码地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,738评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,377评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,774评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,032评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,015评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,239评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,724评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,374评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,410评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,457评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,132评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,733评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,804评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,022评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,515评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,116评论 2 341

推荐阅读更多精彩内容