微信支付,分享,第三方登錄接入指南

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)
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章