近年來三方導(dǎo)流,方便用戶使用App,以及方便App數(shù)據(jù)分享越來越多的App支持了三方登錄以及三方分享網(wǎng)頁和圖片.在此,整理了一系列三方庫(kù)的集成方法以及集成中遇到的問題
微信三方
一,微信配置
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:微信的回掉現(xiàn)在不區(qū)分成功和取消(微信SDK的問題)
C:新版本微信可能沒有province或者country 請(qǐng)仔細(xì)查閱文檔做適配
二,微信三方使用
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.回調(diào)獲取數(shù)據(jù)
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) {
//登錄回調(diào)
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://用戶拒絕授權(quán)
showMessage("用戶拒絕授權(quán)");
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) {
//現(xiàn)階段 取消分享以及分享成功默認(rèn)返回的都是分享成功 邏輯需求請(qǐng)注意
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();
}
}
獲取數(shù)據(jù)
//獲取用戶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?) {
//獲取個(gè)人信息
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:分享網(wǎng)頁
//微信分享
fun shareWechat(
mContext: Context,
url: String,
title: String,
desc: String,
thumbBmp: Bitmap?
) {
var webpage = WXWebpageObject()
val api = WXAPIFactory.createWXAPI(mContext, Constant.APP_WECHAT_KEY)
//長(zhǎng)度小于 10240
webpage.webpageUrl = url
//分享的內(nèi)容
var msg = WXMediaMessage(webpage)
//長(zhǎng)度限制 512
msg.title = title
//長(zhǎng)度限制 1024
msg.description = desc
//byty[] 限制 65536 預(yù)覽圖
msg.setThumbImage(thumbBmp)
val req = SendMessageToWX.Req()
req.message = msg
//分享類型
req.scene = SendMessageToWX.Req.WXSceneSession
api.sendReq(req) //發(fā)送到微信
}
3.分享圖片
fun shareWechatImg(mContext: Context, bmp: Bitmap?) {
val api = WXAPIFactory.createWXAPI(mContext, Constant.APP_WECHAT_KEY)
//初始化 WXImageObject 和 WXMediaMessage 對(duì)象
val imgObj = WXImageObject(bmp)
val msg = WXMediaMessage()
msg.mediaObject = imgObj
val thumbBmp = Bitmap.createScaledBitmap(bmp!!, 120, 120, true)
bmp.recycle()
// 限制 65536 預(yù)覽圖
msg.thumbData = Util.bmpToByteArray(thumbBmp, true)
//構(gòu)造一個(gè)Req
//構(gòu)造一個(gè)Req
val req = SendMessageToWX.Req()
req.transaction = buildTransaction("img")
req.message = msg
req.scene = SendMessageToWX.Req.WXSceneSession
//調(diào)用api接口,發(fā)送數(shù)據(jù)到微信
api.sendReq(req)
}
fun buildTransaction(type: String?): String? {
return if (type == null) System.currentTimeMillis()
.toString() else type + System.currentTimeMillis()
}
4.微信支付
//微信支付 數(shù)據(jù)需要后臺(tái)生成預(yù)訂單的時(shí)候返回支付的數(shù)據(jù)(放后臺(tái)做前端不做)
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)
}
總結(jié):
三方庫(kù)簡(jiǎn)單的集成以及主要功能實(shí)現(xiàn),以此記錄,歡迎問題探討,來都來了點(diǎn)個(gè)贊再走吧!!!