首页 > 其他分享 >Android三方支付对接方案

Android三方支付对接方案

时间:2023-10-08 14:11:07浏览次数:32  
标签:三方 微信 req 对接 prePayData 支付 msg Android WX

场景

用户在APP中下单,跳转到支付宝/微信中完成支付,支付完后跳回到APP内,展示支付结果。

支付宝对接

接入前准备

https://opendoc.alipay.com/open/204/105051?pathHash=b91b9616 https://opendocs.alipay.com/open/204/01dcc0

步骤

  1. 添加支付宝sdk依赖。
    api com.alipay.sdk:alipaysdk-android:+@aar
  2. 拿到后端返回的换起支付宝的支付参数,进行支付。
       private void aliPay(String info) {
    //      Toast.makeText(mContext, "正在支付...", Toast.LENGTH_LONG).show();
            final String orderInfo = info; // 订单信息
            Runnable payRunnable = new Runnable() {
    
                @Override
                public void run() {
                    PayTask alipay = new PayTask(mContext);
                    Map<String, String> result = alipay.payV2(orderInfo, true);
    
                    Message msg = new Message();
                    msg.what = SDK_ALIPAY_FLAG;
                    msg.obj = result;
                    aliPayHandler.sendMessage(msg);
                }
            };
    
            Thread payThread = new Thread(payRunnable);
            payThread.start();
        }
    1. orderInfo:App 支付请求参数字符串,主要包含商家的订单信息,key=value 形式,以 & 连接。
    2. isShowPayLoading:为true,将在唤起pay接口时增加loading作为过渡。
  3. 创建handle接收支付返回的结果。
private Handler aliPayHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == SDK_ALIPAY_FLAG) {

                Map<String, String> payResult = ((Map<String, String>) msg.obj);
                /**
                 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                 */
                String resultStatus = payResult.get("resultStatus");
                // 判断resultStatus 为9000则代表支付成功
                if (TextUtils.equals(resultStatus, "9000")) {
                    // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                    mListener.payResult(1);
                } else {
                    mListener.payResult(-1);
                    // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
//                    ToastUtil.INSTANCE.toast("支付失败");
                }
            }
        }
    };
  1. 拿到支付回调后,轮询后端接口,拿到最终的支付结果。

注意事项

Android10新增了包可见权限,访问外部apk,需要在mainfest中添加对应apk的包名。
<queries>
    <!-- 微信支付客户端-->
    <package android:name="com.tencent.mm" />
    <!-- 支付宝支付客户端-->
    <package android:name="com.eg.android.AlipayGphone" />
</queries>

微信对接

接入前准备

https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_5_1.shtml

步骤

  1. 添加微信sdk依赖。
    implementation com.tencent.mm.opensdk:wechat-sdk-android-without-mta:5.5.8
  2. 在app中进行微信的注册。
    private var wxApi: IWXAPI? = null
    
    fun getWxApi(): IWXAPI? {
        if (wxApi == null) {
            // 注册微信
            wxApi = WXAPIFactory.createWXAPI(ContextHolder.get(), ConstantConfig.WX_APPID)
            wxApi?.registerApp(ConstantConfig.WX_APPID)
        }
        return wxApi
    }
  3. 拿到后端返回的换起微信支付的参数,我们可以转换为微信需要的对象。
    req.appId = ConstantConfig.WX_APPID
    req.partnerId = prePayData.partnerid //这些数据都是接口返回的
    req.timeStamp = prePayData.timestamp
    req.nonceStr = prePayData.noncestr
    req.prepayId = prePayData.prepayid
    req.sign =  prePayData.sign
    req.packageValue = "Sign=WXPay"
    1. appid:微信开放平台审核通过的移动应用appid 。
    2. partnerid:商户号mchid对应的值
    3. prepayid:微信返回的支付交易会话ID,该值有效期为2小时
    4. package:固定值Sign=WXPay
    5. noncestr:随机字符串,不长于32位。
    6. timestamp:时间戳,秒。
    7. sign:签名,使用字段appId、timeStamp、nonceStr、prepayid计算得出的签名值
  4. 唤起支付。
/**
 * @param payFrom 支付来源
 * 微信支付start
 */
fun wxPay(prePayData: PrePayBean, error:()->Unit) {
    if (getWxApi() != null) {
        if (getWxApi()?.isWXAppInstalled == true) {
            val req = PayReq()
            req.appId = ConstantConfig.WX_APPID
            req.partnerId = prePayData.partnerid //这些数据都是接口返回的
            req.timeStamp = prePayData.timestamp
            req.nonceStr = prePayData.noncestr
            req.prepayId = prePayData.prepayid
            req.sign =  prePayData.sign
            req.packageValue = "Sign=WXPay"
            getWxApi()?.sendReq(req)
        } else {
            error.invoke()
            ToastUtil.showNormal( "微信客户端未安装")
        }
    }
}
  1. 在包名目录下建一个wxapi的目录,新建WXPayEntryActivity接收返回的支付。
class WXPayEntryActivity : Activity(), IWXAPIEventHandler {
    private var mContext: Context? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mContext = this@WXPayEntryActivity
        PayUtil.getWxApi()?.handleIntent(intent, this)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        setIntent(intent)
        PayUtil.getWxApi()?.handleIntent(intent, this)

    }



    override fun onReq(baseReq: BaseReq) {
        finish()
    }

    override fun onResp(resp: BaseResp) {
        LogUtils.e( "payResp.onResp ")
        if (resp.type == ConstantsAPI.COMMAND_PAY_BY_WX) {

            val payResp = resp as PayResp
            val extData = payResp.extData //区分支付来源
            val bundle = Bundle()
            LogUtils.e( "payResp.extData = $extData     ${resp.errCode}")
            bundle.putString("payFrom", extData)
            if (resp.errCode == BaseResp.ErrCode.ERR_OK) {
                // 微信支付成功,发个通知
                MsgSender.getInstance().send(Channel.RechargeChannel.WX_PAY_SUCCESS,bundle)
            } else {
                MsgSender.getInstance().send(Channel.RechargeChannel.WX_PAY_FAIL,bundle)

            }
        }else{
            MsgSender.getInstance().send(Channel.RechargeChannel.WX_PAY_FAIL,Bundle())
        }
        finish()
    }
}
记得在manifest文件中注册一下。
<activity
    android:name="kball.winpowerdata.wxapi.WXPayEntryActivity"
    android:exported="true"
    android:launchMode="singleTop"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />
综上,支付流程就结束了,我们可以拿到支付的结果,成功或者失败去做app自定义的展示。

注意事项

Android10新增了包可见权限,访问外部apk,需要在mainfest中添加对应apk的包名。
<queries>
    <!-- 微信支付客户端-->
    <package android:name="com.tencent.mm" />
    <!-- 支付宝支付客户端-->
    <package android:name="com.eg.android.AlipayGphone" />
</queries>

FAQ

1.android SDK提示:微信appid不对?

注册微信api时需填写微信官网上注册的应用对应的appId。

2.微信唤起失败?

检查WXEntryActivity的目录是否为{packageName}.wxapi,否则微信唤起失败。

3.android SDK提示:支付验证签名失败?

后端拿到签名参数后必须再次签名,务必让后端检查签名是否一样。

4.微信未登录,唤起微信后,将微信退到后台,又返回,页面还是加载中,拿不到微信回调?

目前该场景不会走wxEntryActivity里的onResp方法,考虑手动处理,在换起微信应用后开始计时,在5分钟内拿不到微信回调记为失败情况。

标签:三方,微信,req,对接,prePayData,支付,msg,Android,WX
From: https://www.cnblogs.com/fangg/p/17748922.html

相关文章

  • 升讯威在线客服系统的并发高性能数据处理技术:对接百度自动翻译
    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户。对我来说,只要能获得用户的认可,就是我最大的动力。最近客服系统成功经受住了客户现场组织的压力测试,获得了客户的认可。客户组织多名客服上线后,所有员工同一时间打开访客页面疯狂不停的给在线客服发消......
  • Android Jetpack 理解SavedStateHandle
    jetpack库理解SavedStateHandle作用和ViewModel协作,用于从Activity销毁重建中恢复ViewModel的相关状态数据,我们知道当Activity被安卓系统销毁和重建的时候会调用onSaveInstanceState和onRestoreInstanceState方法,这个方法对于ViewModel来说是无法感知的,SavedStateHandle填补了这......
  • 软件测评怎么做?首选第三方软件检测机构
    ​ 第三方软件测评机构1.明确测试需求,形成清晰可量化的测试项如甲方信息化建设项目验收测试,一般参考合同签订的内容要求、开发阶段甲方提出的需求更改以及增加需求、最终需要做验收测试报告时与甲方再次核实参考监理单位意见来敲定测试内容。如,政府科技项目验收测试则依照科......
  • 基于android的中医体质的社区居民健康管理系统-计算机毕业设计源码+LW文档
    摘要首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本......
  • 记录在广州两个月的Android面试插曲和感想
    前言一晃眼9月份了,入职快两个月闲着才想着写一份面经,从今年4月份离的职,中间休息加上学习一个半月(好不容易有闲时间就有些懈怠了)剩下一个半月的时间,通过内推+BOSS直聘,前前后后约到了10几家面试,终于拿到了一个满意的offer,仍然是一家做海外APP的公司。离职上家公司位于广州天河区,是一......
  • [知识管理] Obsidian + Remotely Save插件 + 第三方存储/OSS(七牛云)的同步方案
    0序言在几经选择、对比之后,我选择:Obsidian+RemotelySave插件+第三方存储/OSS(七牛云)的方案来搭建自己的【知识管理系统】。对比分析知识管理工具的过程,详情参见:[知识管理]个人知识管理之知识管理工具的全面分析-博客园/千千寰宇【推荐】知识管理与数据管理系......
  • Androidstudio中 unable to execute Clang-tidy clazy-standalone is not found or ca
    这个问题可能是因为AndroidStudio不支持clazy,但是在设置菜单中仍然提供了这个选项,并且在这种情况下,它似乎被启用了¹。当通过clangd启用clang-tidy时,没有什么需要做的。当通过clangd禁用clang-tidy时,如果启用了clazy,就会出现这个错误¹。要解决这个问题,你可以尝试以下步骤:1.转......
  • Android12获取蓝牙权限
    在Android12中使用蓝牙访问设备,弹出了提示允许发现并连接到附近设备,但是搜索不到蓝牙Android11:android.permission.BLUETOOTH、android.permission.BLUETOOTH_ADMINAndroid12:android.permission.BLUETOOTH_SCAN、android.permission.BLUETOOTH_ADVERTISE、android.permission.......
  • vscode单步调试Android c++源码
    vscode单步调试Androidc++源码  目录步骤1.运行gdbclient.py脚本2.复制生成的launch.json并新建/home/jetson/android_aosp/aosp/.vscode/launch.json3.运行gdb即可,打断点参考 步骤注意:这个过程需要在Android源码环境中运行,可以使用adb端口转发工具,来......
  • 2023中大厂Android面试八股文合集,GitHub,牛客,leetcode已爆火!
    前言金九银十已过半,不知道大家现在都到哪个阶段了,有没有已经找到心仪的工作的朋友?有没有还没准备好面试在各大平台找资料临时抱佛脚的朋友?或是现在在准备,想要明年金三银四跳槽的朋友?不管你是现在急切找工作还是找资料备战,我都非常推荐你看看我花2个多月从GitHub,牛客,leetcode上为大......