支付类型:

一次性支付

自动续费(支付宝周期扣款、微信委托扣款):1.支付并签约 2.先签约后扣费

注:微信委托扣款中先签约后扣费:自动续费、授权扣款、免密支付

支付宝

支付流程中各端交互逻辑

支付流程中商户APP端交互逻辑

先签约后扣费流程中各端交互逻辑:

1. 支付/签约前准备

导入aar集成支付宝客户端SDK,权限声明(网络,网络状态,WiFi状态)

对于先签约后扣费:判断是否安装支付宝。

根据用户ID、商品ID、支付平台等请求后台生成调起支付/签约所需参数:1.一次性支付、支付并签约:String orderInfo,订单号:String orderId。2.先签约后扣费:String signParams

注:一次性支付、支付并签约:对APP调起支付来说没区别。区别在于后台请求生成订单时传入更多参数:如周期规则参数(首次扣费时间、扣费周期单位、扣费周期数量…)

// 判断是否安装支付宝:检查包名com.eg.android.AlipayGphone是否存在
List<PackageInfo> packageInfoList = context.getPackageManager().getInstalledPackages(0);
boolean hasWallet = packageInfoList.stream().map(packageInfo -> packageInfo.packageName).anyMatch(s -> s.equals("com.eg.android.AlipayGphone"));

2. 调起支付/签约

  • 一次性支付 、支付并签约

    根据后台生成的订单信息,子线程中通过同步方法PayTask#payV2(String orderInfo, boolean isShowPayLoading)调起支付,完成同步支付与异步签约。

    String orderInfo:支付参数字符串,主要包含商户的订单信息,key=value形式,以&连接。

    boolean isShowPayLoading:调起支付宝时是否显示一个loading,建议为true

    // 服务器获取的订单信息
    final String orderInfo = info;// 调起支付逻辑
    Runnable payRunnable = new Runnable() {@Overridepublic void run() {PayTask payTask = new PayTask(activity);Map<String, String> result = payTask.payV2(orderInfo, true);// 支付结果处理......// handler.sendMessage()}
    };// 调起支付
    Thread payThread = new Thread(payRunnable);
    payThread.start();
    
  • 先签约后扣费

    将后台生成的签约参数拼接到下面链接之后(该链接里面的appid为固定值,不可修改),APP通过scheme唤起支付宝进行签约。

    “alipays://platformapi/startapp?appId=60000157&appClearTop=false&startMultApp=YES&sign_params=”
    

3. 支付/签约结果处理

  • 一次性支付、支付并签约

    支付完成之后会自动回到app中。

    同步通知PayTask#payV2()方法同步返回的结果Map<String, String>去后台验签解析获取支付结果。

    异步通知:后台创建订单的请求参数包含异步通知地址notify_url、sign_notify_url,支付完成后支付宝服务器会发送异步通知,后台也可查询接口确认结果。

    Map<String, String>

    {"memo" : "xxxxx","result" : "{\"alipay_trade_app_pay_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"app_id\":\"2014072300007148\",\"out_trade_no\":\"081622560194853\",\"trade_no\":\"2016081621001004400236957647\",\"total_amount\":\"0.01\",\"seller_id\":\"2088702849871851\",\"charset\":\"utf-8\",\"timestamp\":\"2016-10-11 17:43:36\"},\"sign\":\"NGfStJf3i3ooWBuCDIQSumOpaGBcQz+aoAqyGh3W6EqA/gmyPYwLJ2REFijY9XPTApI9YglZyMw+ZMhd3kb0mh4RAXMrb6mekX4Zu8Nf6geOwIa9kLOnw0IMCjxi4abDIfXhxrXyj********\",\"sign_type\":\"RSA2\"}","resultStatus" : "9000"
    }
    

    resultStatus:

    9000 订单支付成功
    8000 正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
    4000 订单支付失败
    5000 重复请求
    6001 用户中途取消
    6002 网络连接出错
    6004 支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
    其它 其它支付错误

    有些时候会出现商户app 在支付宝支付阶段被关闭导致无法正确收到同步结果,此时支付结果可以完全依赖服务端的异步通知。 由于同步通知和异步通知都可以作为支付完成的凭证,且异步通知支付宝一定会确保发送给商户服务端。为了简化集成流程,商户可以将同步结果仅仅作为一个支付结束的通知(忽略执行校验),实际支付是否成功,完全依赖服务端异步通知。

  • 先签约后扣费

    同步通知:后台调用支付宝个人协议页面签约接口时传入return_url;如果没有传入 return_url,那么签约完成后不再返回APP,直接回到支付宝首页。签约成功的情况下,可以在return_url里面设置APP的scheme地址去返回APP。同步通知会在return_url 后面拼接返回参数,可将参数去后台验签。

    异步通知:异步通知(notify_url/应用网关地址)仅当用户签约成功或解约成功时触发。后台也可通过查询接口确认签约结果。

微信

支付流程中各端交互逻辑

支付流程中商户APP端交互逻辑

1. 支付/签约前准备

添加依赖:implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+',权限声明:android.permission.INTERNET

判断微信是否可用。

根据用户ID、商品ID、支付平台等请求后台生成调起支付/签约所需参数:1.一次性支付、支付并签约:prepay_id…。2.先签约后扣费:pre_entrustweb_id(两个小时内有效)。

注:一次性支付、支付并签约:对APP调起支付来说没区别。区别在于后台请求不同的接口生成prepay_id。

// 微信接口
IWXAPI wxapi = WXAPIFactory.createWXAPI(context, null);// 未安装微信
if (!wxapi.isWXAppInstalled()) {}// 微信版本低不支持支付
if (wxapi.getWXAppSupportAPI() < Build.PAY_SUPPORTED_SDK_INT) {}
// 需要服务器返回的订单信息// 1.调起支付所需参数
private String appId; // APP ID
private String partnerId; // 商户号
private String prepayId; // 后台去微信服务器请求生成的预支付ID:有效期2小时
private String packageValue; // 扩展字段,暂填写固定值"Sign=WXPay"
private String nonceStr; // 随机字符串
private String timeStamp; // 时间戳:自1970年1月1日 0点0分0秒以来的秒数
private String sign; // 签名:签名方式一定要与统一下单接口使用的一致// 2.订单号,用于支付结果查询
private String orderId;

2. 调起支付/签约

  • 一次性付费、支付并签约

    根据服务器获取的相关信息,创建PayReq,IWXAPI调起支付

    // 微信API
    IWXAPI wxapi = WXAPIFactory.createWXAPI(context, null);
    // 注册APP
    wxapi.registerApp(appId);// 调起支付对象PayReq
    PayReq payReq = new PayReq();
    payReq.appId = "";
    payReq.partnerId = "";
    payReq.prepayId = "";
    payReq.packageValue = "";
    payReq.nonceStr = "";
    payReq.timeStamp = "";
    payReq.sign = "";
    payReq.extData = ""; // 可附加的额外数据(如加入订单号)。会在微信回调Activity中返回// 调起支付
    // PayReq参数不正确会导致调起微信支付失败,返回false;
    // PayReq参数正确则调起微信支付成功,返回true。
    wxapi.sendReq(payReq);
    
  • 先签约后扣费

    后台预签约生成pre_entrustweb_id。

    WXOpenBusinessWebview.Req req = new WXOpenBusinessWebview.Req();req.businessType = 12; // 固定值
    HashMap queryInfo = new HashMap<>();
    queryInfo.put("pre_entrustweb_id","......";
    req.queryInfo = queryInfo;api.sendReq(req);
    

3. 支付/签约结果处理

  • 一次性支付、支付并签约

    同步通知:通过微信支付界面返回APP,会回调WXPayEntryActivity,可在此界面处理支付结果。"失败"或"成功"则去后台查询确认结果,“取消"可直接提示。

    异步通知:完成支付后微信将支付结果发送到notify_url,将签约结果发送到contract_notify_url。

    注:未完成支付则签约也失败。

    • 通过WXPayEntryActivity处理支付结果

      1. 目录:申请商户号时提供的包名.wxapi.WXPayEntryActivity

      2. Activity注册

        <activity name=".wxapi.WXPayEntryActivity"android:exported="true"android:launchMode="singleTop" />
        
      3. Activity实现IWXAPIEventHandler重写onResp(BaseResp resp)

        public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {private IWXAPI wxapi;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);wxapi = WXAPIFactory.createWXAPI(getApplicationContext(), null);wxapi.handleIntent(getIntent(), this);}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);wxapi.handleIntent(intent, this);}@Overridepublic void onReq(BaseReq baseReq) {}@Overridepublic void onResp(BaseResp baseResp) {// 微信支付if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {// 订单号String orderId = ((PayResp) baseResp).extData;switch (baseResp.errCode) {case 0: // 支付成功 BaseResp.ErrCode.ERR_OK// 支付结果服务器查询break;case -1: // 支付错误// 支付结果服务器查询break;case -2: // 用户取消 BaseResp.ErrCode.ERR_USER_CANCEL// 支付取消,可通知服务器关闭此订单break;default:break;}// 退出activityfinish();}}}
        

    • 通过WXPayEntryActivity处理支付结果存在一个问题:不通过微信支付界面返回APP,支付结果得不到处理。

      1. 调起支付情况分析:

        微信启动了

        微信返回APP

        ​ onPause() 支付界面 onResume()

        不通过微信返回APP

        ​ onPause() 支付界面 home->onStop() app->onStart() onResume()

        微信未启动

        微信返回APP

        ​ onPause() 微信界面 onStop() 自动返回app->onStart() 支付界面 onResume()

        不通过微信返回APP

        ​ onPause() 微信界面 onStop() 自动返回app->onStart() 支付界面 home->onResume()、onPause()、onStop() app->onStart() onResume()

      2. 解决方法

        发起支付前,存下订单号。

         String orderId = "...";
        

        onResume()生命周期下查询订单支付结果。

         if (orderId == null) {return;
        }// 服务器查询订单// 重置
        orderId = null;
        

        注意:在“微信未启动”且“不通过微信返回APP”时,在微信支付界面按下home会回调onResume()去服务器查询支付结果。

  • 先签约后扣费

    完成签约后微信将支付结果发送到notify_url,安卓暂不支持返回APP,签约完成后停留在微信内。

支付宝、微信Android APP支付接入流程相关推荐

  1. 微信APP支付接入流程(含服务端,非第三方)

    此文章与简书内容同步更新https://www.jianshu.com/p/3dac1db27247 首先是微信APP的支付流程,看着很多流程,其实主要的大致分为以下几个步骤 1.客户端选择商品下单( ...

  2. 支付宝PC扫码支付接入流程及代码示例

    准备工作 1:下载支付宝开放平台开发助手,使用助手工具生成应用公钥和应用私钥. 参考文档: 生成密钥 | 开放平台 2:给应用配置接口加签方式,此处的目的是将应用appid与应用公钥绑定. 参考文档: ...

  3. Android App支付系列(一):微信支付接入详细指南(附官方支付demo)

    写在前面 一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统显然是不明智的,国内已经有多家成熟的移动支付提供商,腾讯就是其中之一.梳理了下微信支付的接入,今天给大家分享下腾讯旗下的 ...

  4. Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)

    前言 一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统对于资源有限的公司来说显然不太明智,国内已经有多家成熟的移动支付提供商,阿里就是其中之一. 继< Android Ap ...

  5. Android App支付:支付宝SDK接入详细指南(附官方支付demo)

    Android App支付:支付宝SDK接入详细指南(附官方支付demo) 前言 一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统对于资源有限的公司来说显然不太明智,国内已经有多 ...

  6. android 微信支付过程,android 微信 支付 接入流程总结

    [TOC] 客户端微信支付 登录微信官方开放平台微信,注册账号,在微信开放平台申请应用,输入已上线app的正式的应用包名和签名,微信提供了一个签名工具,一般使用它提供的签名工具生成签名,然后填写到对应 ...

  7. 支付宝支付 App支付以及网页支付接入流程

    支付宝支付申请流程 该文档支付包含两部分:支付宝App支付以及支付宝网页支付(手机网站支付) 注:使用时根据需要去开通即可 前提: 1.注册支付宝开发者账户,注册流程参见<支付宝开发者帐号注册及 ...

  8. 微信免密支付php代码实现,微信刷卡支付接入模式及免密流程

    根据商户具体的情况,刷卡支付接入模式可分为:商户后台接入和门店接入: 根据用户是否需要输入支付密码可分为:免密模式和验密模式. 1.接入模式-商户后台接入 该模式适合具备统一后台系统的商户.门店收银台 ...

  9. 支付宝 微信 内购 支付

    iOS支付 iOS支付分为两类,第三方支付和应用内支付(内购). 第三方支付包括:支付宝支付.微信支付.银联支付.百度钱包.京东支付等等. 应用内支付(In-App Purchase):在应用程序内购 ...

最新文章

  1. 物理学需要哲学,哲学需要物理学
  2. python使用缩进作为语法边界-python二级备考 day2
  3. c++和python先学哪个?
  4. 实现自我隐藏 CPU 利用率的最佳方法,不妨一试!
  5. 【数据结构amp;amp;等差数列】KMP简介和算法的实现(c++ amp;amp; java)
  6. OFDM中保护间隔与循环前缀抵抗ISI…
  7. 深入理解Unity刚体(Rigidbody)、碰撞器(Collider)、触发器(Trigger)
  8. 数据库 : 事物以及隔离性导致的问题
  9. mongoDB VS PostgreSQL dml performance use python (pymongo py-postgresql)
  10. 【Python】学习笔记2-数据类型:数组、数组循环切片
  11. 计算机学号生成准考证号,设计考场编排,生成准考证号
  12. 【Win10安装字体+免费字体库】Windows10安装新字体教程,免费在线字体库推荐
  13. Abaqus简单部件受力分析
  14. 数据结构与算法分析(一)
  15. 离散数学关于等价关系的证明
  16. 车载系统模块资料整理
  17. WebSphere 环境搭建
  18. [滴水石穿]poj 1007-DNA Sorting 结题报告【1】
  19. C#使用 MailKit获取邮件中的附件(QQ邮箱/163网易邮箱)
  20. 如何在 Windows 上查看 HEIC 格式照片

热门文章

  1. MS-Model【1】:nnU-Net
  2. talend导出数据到oracle,Talend使用步骤.pdf
  3. 德国sycotec原KAVO义齿雕刻主轴在义齿切削机的应用案例
  4. SGX_SQLite【源码分析】
  5. 2020-11-19 吴恩达DL学习-C5 序列模型-W3 序列模型和注意力机制(3.4 改进定向搜索-长度归一化,称为归一化的对数似然目标函数。取每个单词的概率对数值的平均。非精确搜索,速度快)
  6. fastadmin 生成邀请海报
  7. 如何科学的做用户研究?
  8. 多线程中的临界资源问题
  9. 2022年认证杯(小美赛)ABCD四题已出
  10. 《Python测试开发技术栈—巴哥职场进化记》—软件测试工程师“兵器库”