微信支付的回调 一般的做法有:
1、用单例类解决/静态函数
- 需要注意回收
- 如果有多个地方有支付,需要维护多个回调
2、Eventbus (这个比较常用)
- 需要注册和接触注册
- 支付的页面在有叠加的情况下
- 如果需要准确的回调到对应的页面,那么需要每个页面都要做订单id判断
3、系统广播
-
需要注册和解除注册
-
用订单号来发广播不需要维护多个回调
-
系统广播 + Lifecycle 封装后, 不需要每个页面都去注册和解除注册
-
WXPayEntryActivity 中的代码:
@Override
public void onResp(BaseResp resp) {
AppPayHelper.sendWeiXinPayResp(this, resp);
finish();
}
- 使用的时候代码:
AppPayHelper.get(this).setCallback(object : AppPayHelper.OnPayCallback() {
override fun onSuccess(prepayId: String) {
loadingDialog.dismiss()
finish()
}
override fun onCancel(prepayId: String) {
loadingDialog.dismiss()
ToastUtil.show("支付已取消")
}
override fun onError(prepayId: String, throwable: Throwable) {
loadingDialog.dismiss()
ToastUtil.show(throwable.message.toDefault(""))
}
}).onWeiXinPay(WeiXinUtil.WEIXIN_APP_ID, dto.noncestr, dto.partnerid, dto.prepayid, dto.pck, dto.timestamp, dto.sign)
- 封装代码:
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.tencent.mm.opensdk.constants.ConstantsAPI
import com.tencent.mm.opensdk.modelpay.PayReq
import com.tencent.mm.opensdk.openapi.WXAPIFactory
import com.tencent.mm.opensdk.modelbase.BaseResp
import com.tencent.mm.opensdk.modelpay.PayResp
/**
* 微信支付 帮助类
*/
object WxPayHelper {
/**
* 微信返回的参数 支付实体
*/
private const val WX_PAY_RESP = "wx_pay_resp"
private const val BROADCAST_PAY = "WxPayHelper"
/**
* 微信支付成功,通过发广播来回调给 发起支付的页面
*/
@JvmStatic
fun sendWeiXinPayResp(context: Context?, resp: BaseResp?) {
context ?: return
resp ?: return
//这里只处理微信支付的回调
if (resp.type != ConstantsAPI.COMMAND_PAY_BY_WX) {
return
}
//将微信的baseResp 转成 payResp 能拿到 预订单id,
//通过预订单id 发送对应的广播,保证发起支付对象的 预订单id,和 支付结果的 预订单id一致
val payResp = (resp as? PayResp)
//toDefault 使用来判空的
val intent = Intent(BROADCAST_PAY + payResp?