1.添加依賴
2.申請appid
3.在包下新建wxapi文件夾,並且新建WXEntryActivity.kt和WXPayEntryActivity.kt兩個文件夾,後者是支付回調。
import android.app.Activity
import android.content.Intent
import android.os.Bundle
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.zf.dc.api.UriConstant
import com.zf.dc.showToast
import com.zf.dc.ui.activity.LoginActivity
import com.zf.dc.utils.LogUtils
class WXEntryActivity : Activity(), IWXAPIEventHandler {
/**
* 拿code請求以下鏈接獲取access_token:
* "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code"
* 獲取用戶個人信息:
* "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID"
*/
private var api: IWXAPI? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
api = WXAPIFactory.createWXAPI(this, UriConstant.WX_APP_ID, false)
api?.handleIntent(intent, this)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
setIntent(intent)
api?.handleIntent(intent, this)
}
//應用請求微信的相應回調
override fun onResp(resp: BaseResp?) {
LogUtils.e(">>>>>>微信普通回調?")
LogUtils.e(">>>>>>WX登錄普通回調結果:" + resp?.errCode + " 類型:" + resp?.type)
when (resp?.errCode) {
BaseResp.ErrCode.ERR_OK -> {
when (resp.type) {
ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX -> {
showToast("分享成功")
finish()
}
}
/** 除了登錄才能成功往下執行,否則到這裏就拋錯跳出了。 */
val code = (resp as SendAuth.Resp).code
if (code.isNotEmpty()) {
//登錄成功,清除全部活動,跳轉到首頁
val intent = Intent(this, LoginActivity::class.java)
intent.putExtra("code", code)
startActivity(intent)
}
finish()
}
BaseResp.ErrCode.ERR_USER_CANCEL -> {
showToast("已取消")
finish()
}
BaseResp.ErrCode.ERR_AUTH_DENIED -> {
showToast("已拒絕")
finish()
}
else -> {
showToast("失敗")
finish()
}
}
}
//微信發送請求到應用的回調
override fun onReq(p0: BaseReq?) {
finish()
}
}
import android.app.Activity
import android.content.Intent
import android.os.Bundle
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.openapi.IWXAPI
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler
import com.tencent.mm.opensdk.openapi.WXAPIFactory
import com.zf.dc.api.UriConstant
import com.zf.dc.showToast
import com.zf.dc.utils.bus.RxBus
class WXPayEntryActivity : Activity(), IWXAPIEventHandler {
private var api: IWXAPI? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
api = WXAPIFactory.createWXAPI(this, UriConstant.WX_APP_ID, false)
api?.handleIntent(intent, this)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
setIntent(intent)
api?.handleIntent(intent, this)
}
/**
* 微信支付回調 //0 成功 展示成功頁面
* //-1 錯誤 可能的原因:簽名錯誤、未註冊APPID、項目設置APPID不正確、註冊的APPID與設置的不匹配、其他異常等。
* //-2 用戶取消 無需處理。發生場景:用戶不支付了,點擊取消,返回APP。
*/
//應用請求微信的相應回調
override fun onResp(resp: BaseResp?) {
when (resp?.errCode) {
BaseResp.ErrCode.ERR_OK -> {
when (resp.type) {
ConstantsAPI.COMMAND_PAY_BY_WX -> {
showToast("支付成功")
finish()
RxBus.getDefault().post(UriConstant.WX_PAY_SUCCESS, UriConstant.WX_PAY_SUCCESS)
}
}
finish()
}
BaseResp.ErrCode.ERR_USER_CANCEL -> {
showToast("已取消")
finish()
}
BaseResp.ErrCode.ERR_AUTH_DENIED -> {
showToast("已拒絕")
finish()
}
else -> {
showToast("支付失敗")
finish()
}
}
}
//微信發送請求到應用的回調
override fun onReq(p0: BaseReq?) {
finish()
}
}
4.登錄的代碼
//微信登錄
wxLogin.setOnClickListener {
val api = WXAPIFactory.createWXAPI(this, UriConstant.WX_APP_ID, true)
// 將應用的appId註冊到微信
api.registerApp(UriConstant.WX_APP_ID)
if (!api.isWXAppInstalled) {
showToast("未安裝微信")
} else {
val req = SendAuth.Req()
req.scope = "snsapi_userinfo"
req.state = "wechat_sdk_zf"
api.sendReq(req)
}
}
5.分享網頁鏈接的代碼
//分享
shareLayout.setOnClickListener {
val api = WXAPIFactory.createWXAPI(this, UriConstant.WX_APP_ID, true)
// 將應用的appId註冊到微信
api.registerApp(UriConstant.WX_APP_ID)
if (!api.isWXAppInstalled) {
showToast("未安裝微信")
} else {
/** 發送文字類型 */
val webObj = WXWebpageObject()
webObj.webpageUrl =
UriConstant.BASE_URL + "shop/detail?team_id=" + mGroupBean?.info?.team_id + "&goods_id=" + mGroupBean?.info?.goods_id
val msg = WXMediaMessage()
msg.mediaObject = webObj //消息對象
msg.title = "商城" //標題
msg.description = mGroupBean?.info?.goods_name
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.icon_dc_logo2)
msg.thumbData = WXBmpUtil.getBitmapBytes(bitmap, false)
val req = SendMessageToWX.Req()
req.transaction = buildTransaction("text")
req.message = msg
req.scene = mTargetScene
api.sendReq(req)
}
}
6.WXBmpUtil.java
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import java.io.ByteArrayOutputStream;
public class WXBmpUtil {
public static byte[] getBitmapBytes(Bitmap bitmap, boolean paramBoolean) {
Bitmap localBitmap = Bitmap.createBitmap(80, 80, Bitmap.Config.RGB_565);
Canvas localCanvas = new Canvas(localBitmap);
int i;
int j;
if (bitmap.getHeight() > bitmap.getWidth()) {
i = bitmap.getWidth();
j = bitmap.getWidth();
} else {
i = bitmap.getHeight();
j = bitmap.getHeight();
}
while (true) {
localCanvas.drawBitmap(bitmap, new Rect(0, 0, i, j), new Rect(0, 0,
80, 80), null);
if (paramBoolean)
bitmap.recycle();
ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream();
localBitmap.compress(Bitmap.CompressFormat.JPEG, 100,
localByteArrayOutputStream);
localBitmap.recycle();
byte[] arrayOfByte = localByteArrayOutputStream.toByteArray();
try {
localByteArrayOutputStream.close();
return arrayOfByte;
} catch (Exception e) {
// F.out(e);
}
i = bitmap.getHeight();
j = bitmap.getHeight();
}
}
}
7.支付代碼
val api = WXAPIFactory.createWXAPI(this, UriConstant.WX_APP_ID, true)
api.registerApp(UriConstant.WX_APP_ID)
if (!api.isWXAppInstalled) {
showToast("未安裝微信")
} else {
val req = PayReq()
req.appId = bean.appid
req.partnerId = bean.partnerid
req.prepayId = bean.prepayid
req.packageValue = bean.packageValue
req.nonceStr = bean.noncestr
req.timeStamp = bean.timestamp
req.sign = bean.sign
api.sendReq(req)
}