目录

一、调用支付宝主动签约接口

二、参数说明

三、查询签约结果接口

四、签约成功,根据签约协议号,发起主动扣款

五、查询扣款结果接口

六、变更签约用户,下次扣款日期

七、取消签约协议接口


一、调用支付宝主动签约接口

1、该接口返回的字符串,由前端生成二维I码后,可使用支付宝直接扫码,打开签约页面

public String aliPayPageSign(AliPayBo bo) {AlipayClient alipayClient = oldAliPayConfig.initAliPayClient();AlipayUserAgreementPageSignRequest request = new AlipayUserAgreementPageSignRequest();Map<String, Object> optionalArgs = new HashMap<>();//周期扣款销售产品码固定为CYCLE_PAY_AUTH。optionalArgs.put("product_code", "CYCLE_PAY_AUTH");//周期扣款个人签约产品码固定为CYCLE_PAY_AUTH_PoptionalArgs.put("personal_product_code","CYCLE_PAY_AUTH_P");//协议签约场景,参见下文sign_scene参数说明  INDUSTRY|EDU教育行业optionalArgs.put("sign_scene", AliPayConstant.SIGN_SCENE);// 商户签约号,代扣协议中标示用户的唯一签约号(确保在商户系统中唯一optionalArgs.put("external_agreement_no",bo.getExternalAgreementNo());/**请按当前接入的方式进行填充,且输入值必须为文档中的参数取值范围,* 1. ALIPAYAPP (钱包h5页面签约)* 2. QRCODE(扫码签约)* 3. QRCODEORSMS(扫码签约或者短信签约)*/Map<String, Object> accessParams = new HashMap<>();accessParams.put("channel","ALIPAYAPP");optionalArgs.put("access_params",accessParams);/**周期管控规则参数period_rule_params,在签约周期扣款产品(如CYCLE_PAY_AUTH_P)时必传,在签约其他产品时无需传入。周期扣款产品,会按照这里传入的参数提示用户,并对发起扣款的时间、金额、次数等做相应限制 */Map<String, Object> periodRuleParams = new HashMap<>();//周期类型period_type是周期扣款产品必填,枚举值为DAY和MONTHperiodRuleParams.put("period_type","DAY");//30天为一个扣款周期periodRuleParams.put("period","30");/**首次执行时间execute_time是周期扣款产品必填,即商户发起首次扣款的时间。精确到日,格式为yyyy-MM-dd结合其他必填的扣款周期参数,会确定商户以后的扣款计划。发起扣款的时间需符合这里的扣款计划首次扣款日期:当前时间+30  ; 目前允许商户在约定日期之前5天(不含扣款日当天)开始扣款*/periodRuleParams.put("execute_time", DateUtils.dateToStr(new Date()));/**单次扣款最大金额single_amount是周期扣款产品必填,即每次发起扣款时限制的最大金额,单位为元。商户每次发起扣款都不允许大于此金额*/periodRuleParams.put("single_amount",bo.getSingleAmount());optionalArgs.put("period_rule_params",periodRuleParams);//签约参数。如果希望在sdk中支付并签约,需要在这里传入签约信息。周期扣款场景 product_code 为 CYCLE_PAY_AUTH 时必填String requestJson = JSONUtil.toJsonStr(optionalArgs);log.info("用户{}:发起周期扣款签约请求,入参:{}",bo.getExternalAgreementNo(),requestJson);request.setBizContent(requestJson);AlipayUserAgreementPageSignResponse response;try {response = alipayClient.pageExecute(request,"get");if(response.isSuccess()){log.info("用户{}:周期扣款,发起签约成功",bo.getExternalAgreementNo());//获取需提交的form表单return response.getBody();}log.info("用户{}:周期扣款,发起签约失败:{}",bo.getExternalAgreementNo(),response.getSubMsg());} catch (AlipayApiException e) {e.printStackTrace();log.error("用户{}:周期扣款,发起签约异常:{}",bo.getExternalAgreementNo(),e);}return null;}

2、我在这里会同步生成1条,用户的申请记录,用于后续定任务,发起主动扣款

CREATE TABLE `dx_member_first_sign_record` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',`member_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '会员ID',`order_no` varchar(50) NOT NULL DEFAULT '' COMMENT '会员订单编号',`external_agreement_no` varchar(50) NOT NULL DEFAULT '-1' COMMENT '商户签约号',`buy_status` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '扣费状态(0:未扣款 1:成功 2:失败)',`goods_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '会员商品ID',`goods_name` varchar(50) DEFAULT '-1' COMMENT '会员商品名称',`goods_length` int(4) DEFAULT '0' COMMENT '充值时长(天)',`consumer_id` bigint(20) NOT NULL DEFAULT '1' COMMENT '买家ID',`consumer_role` tinyint(1) NOT NULL DEFAULT '1' COMMENT '买家角色(1:供货商 2:代销商)',`pay_amount` bigint(20) NOT NULL DEFAULT '0' COMMENT '支付金额',`finish_time` datetime DEFAULT NULL COMMENT '扣款完成时间',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`again_time` datetime DEFAULT NULL COMMENT '再次申请时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`remark` varchar(200) DEFAULT NULL COMMENT '扣费说明',PRIMARY KEY (`id`),KEY `idx_order_no` (`order_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员先签约后扣费记录表';

二、参数说明

1、external_agreement_no  由系统自动生成,确保全局唯一

2、使用老版本SDK

3、周期可以选择自然月和固定天

4、我使用的是定时任务,完成后续的签约成功的首次扣款,所以execute_time,下次扣款日期设置的是当天

5、sign_scene 协议签约场景,参见下文sign_scene参数说明,我使用的是INDUSTRY|EDU教育行业

三、查询签约结果接口

1、根据签约结果,发起首次扣款,如果签约时设置的execute_time 不在规定的时间范围内,支付宝会返回:扣款失败,协议不在有效范围内

2、代码如下:

public AlipayUserAgreementQueryResponse queryAliPaySign(AliPayBo bo) {AlipayClient alipayClient = oldAliPayConfig.initAliPayClient();AlipayUserAgreementQueryRequest request = new AlipayUserAgreementQueryRequest();Map<String,String> requestMap = new HashMap<>();requestMap.put("personal_product_code","CYCLE_PAY_AUTH_P");requestMap.put("sign_scene",AliPayConstant.SIGN_SCENE);requestMap.put("external_agreement_no",bo.getExternalAgreementNo());String requestJson = JSONUtil.toJsonStr(requestMap);log.info("{}:查询周期扣款签约结果入参:{}",bo.getExternalAgreementNo(),requestJson);request.setBizContent(requestJson);AlipayUserAgreementQueryResponse response = null;try {response = alipayClient.execute(request);if (response.isSuccess()) {log.info("{}:查询周期扣款签约结果,调用成功",bo.getExternalAgreementNo());return response;}else {log.info("{}:查询周期扣款签约结果,调用失败:{}",bo.getExternalAgreementNo(),response.getSubMsg());}} catch (AlipayApiException e) {e.printStackTrace();}return null ;}

四、签约成功,根据签约协议号,发起主动扣款

1、签约协议号为,查询签约结果接口返回字段

2、代码如下:

public AlipayTradePayResponse aliPayTradePayByAuthCode(AliPayBo bo) {AlipayClient alipayClient = oldAliPayConfig.initAliPayClient();AlipayTradePayRequest request = new AlipayTradePayRequest();Map<String,String> requestMap = new HashMap<>();//商户订单号requestMap.put("out_trade_no", bo.getOutTradeNo());//必填,周期扣款代扣场景固定值requestMap.put("scene","deduct_pay");//用户签约号 agreement_norequestMap.put("auth_code",bo.getAgreementNo());周期扣款固定requestMap.put("product_code","CYCLE_PAY_AUTH");//订单标题requestMap.put("subject",bo.getSubject());//本次扣款金额requestMap.put("total_amount",bo.getTotalAmount());String requestJson = JSONUtil.toJsonStr(requestMap);log.info("{}:查询签约用户,进行自动续期扣费:{}",bo.getAgreementNo(),requestJson);request.setBizContent(requestJson);AlipayTradePayResponse response =null;try {response = alipayClient.execute(request);if(response.isSuccess()){log.info("{}:周期扣款,主动扣费成功",bo.getAgreementNo());}else {log.info("{}:周期扣款,主动扣费失败:{}",bo.getAgreementNo(),response.getSubMsg());}} catch (Exception e) {e.printStackTrace();}return response;}

3、此接口为老版SDK接口

五、查询扣款结果接口

1、该接口用于,根据商户生成的订单号,查询支付结果

2、根据支付结果,完成后续的业务操作:修改订单状态,增加会员有效期等业务操作

public AlipayTradeQueryResponse queryAliPayTradeByOrderNo(String outTradeNo) {//统一收单线下交易查询AlipayTradeQueryResponse response = null;try {response = Factory.Payment.Common().query(outTradeNo);if(ResponseChecker.success(response)){log.info("{}:查询支付结果,调用成功",outTradeNo);return response;}else {log.info("{}:查询支付结果,调用失败:{}",outTradeNo,response.getSubMsg());}} catch (Exception e) {e.printStackTrace();}return null;}

六、变更签约用户,下次扣款日期

1、因为我们系统的会员有效期有多种途径增加,因为对于签约用户的下次扣款日期,和会员到期时间同频,在会员到期时间增加后,应同步延顺下次扣款日期

public AlipayUserAgreementExecutionplanModifyResponse aliPayModifyPlan(AliPayBo bo) {AlipayClient alipayClient = oldAliPayConfig.initAliPayClient();AlipayUserAgreementExecutionplanModifyRequest request = new AlipayUserAgreementExecutionplanModifyRequest();Map<String,String> requestMap = new HashMap<>();requestMap.put("agreement_no",bo.getAgreementNo());requestMap.put("deduct_time",bo.getDeductTime());String requestJson = JSONUtil.toJsonStr(requestMap);log.info("{}:周期扣款-修改协议执行计划入参:{}",bo.getAgreementNo(),requestJson);request.setBizContent(requestJson);try {AlipayUserAgreementExecutionplanModifyResponse response = alipayClient.execute(request);if(response.isSuccess()){log.info("{}:周期扣款-修改协议执行计划,调用成功",bo.getAgreementNo());return response;} else {log.info("{}:周期扣款-修改协议执行计划,调用失败:{}",bo.getAgreementNo(),response.getSubMsg());}} catch (AlipayApiException e) {e.printStackTrace();log.error("{}:周期扣款-修改协议执行计划,调用异常:{}",bo.getAgreementNo(),e);}return null;}

七、取消签约协议接口

1、用于提供给用户,主动解约

public AlipayUserAgreementUnsignResponse aliPayUnSign(AliPayBo bo) {AlipayClient alipayClient = oldAliPayConfig.initAliPayClient();AlipayUserAgreementUnsignRequest request = new AlipayUserAgreementUnsignRequest();Map<String,String> requestMap = new HashMap<>();requestMap.put("personal_product_code","CYCLE_PAY_AUTH_P");requestMap.put("sign_scene",AliPayConstant.SIGN_SCENE);requestMap.put("external_agreement_no",bo.getExternalAgreementNo());String requestJson = JSONUtil.toJsonStr(requestMap);log.info("{}:周期扣款-解除签约入参:{}",bo.getExternalAgreementNo(),requestJson);request.setBizContent(requestJson);try {AlipayUserAgreementUnsignResponse response = alipayClient.execute(request);if (response.isSuccess()) {log.info("{}:周期扣款-解除签约,调用成功",bo.getExternalAgreementNo());return response;}else {log.info("{}:周期扣款-解除签约,调用失败:{}",bo.getExternalAgreementNo(),response.getSubMsg());}} catch (AlipayApiException e) {e.printStackTrace();log.error("{}:周期扣款-解除签约,调用异常:{}",bo.getExternalAgreementNo(),e);}return null;}

以上,是先签约后代扣场景下应该会用到的接口,接口可以根据真实的业务场景,灵活组合到业务代码中,下面贴一下,我们业务的功能流程图,方便大家理解:

定时任务,筛选上面建表中的,未支付的数据,进行轮询查询签约结果,然后进行扣款

支付宝支付(四):周期扣款-先签约后代扣场景相关推荐

  1. 支付宝小程序唤起签约并支付(周期扣款)

    目录 获取支付参数拼接成的字符串 支付宝小程序内唤起签约并支付页面 获取支付参数拼接成的字符串 调用alipay.trade.app.pay接口,获取orderStr,具体参数如下: 公共请求参数 参 ...

  2. 连续支付(周期扣款)功能开发及注意事项

    最近有一个版本需求,需要接入周期扣款做连续会员的功能,没想到这一做就是小半个月,趟了很多坑,所以觉得有必要记录一下 1.周期扣款总体设计 在支付宝和微信中(非苹果支付),周期扣款的流程主要有以下两种, ...

  3. 支付宝支付(五):周期扣款-支付后签约场景

    目录 一.调用APP支付接口,拉起支付宝,支付并签约页面 二.业务流程图 三.心声 一.调用APP支付接口,拉起支付宝,支付并签约页面 1.业务代码如下: public AlipayTradeAppP ...

  4. JAVA集成支付宝支付 周期扣费 (证书方式)

    依赖 <!-- <dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-s ...

  5. iOS - AliPay 支付宝支付

    1.支付宝支付申请 支付宝支付官方签约集成指引 支付宝APP支付官方集成指引 蚂蚁金服开放平台 1.1 支付宝 APP 支付申请步骤 APP 支付:APP 支付是商户通过在移动端应用 APP 中集成开 ...

  6. PHP版本对接支付宝支付接口 电脑网站 详细介绍 沙箱环境 超简单易懂

    PHP版本对接支付宝支付接口 其实理顺了思路后,按照我接下来的步骤来,真的超级简单啊,为啥有那么多的朋友们折腾了那么久呢,嘿嘿,接下来跟我走吧~ 我是昨天晚上洗完澡之后,大概八九点,才开始正式开工尝试 ...

  7. 微擎支付返回商户单号_微信、支付宝支付动态库PayApiFun.dll说明

    微信.支付宝支付动态库PayApiFun.dll说明 PayApiFun.dll这个动态库中包含了:微信付款码支付.生成微信支付二维码扫码支付.按商户单号查询微信支付状态.关闭未支付的微信订单.支付宝 ...

  8. 支付宝周期扣款(支付后签约)业务功能总结(php+golang)

    文档 周期扣款支付后签约场景文档:https://opendocs.alipay.com/open/041bxs 业务流程 1.处理签约成功回调,添加到订阅表 2.定时任务自行请求订阅表,把达到扣款日 ...

  9. 支付宝周期扣款Java逻辑代码

    public static void main(String[] args) {/** 初始化 **/CertAlipayRequest certAlipayRequest = new CertAli ...

最新文章

  1. win10装linux grub,在Win10下安装Ubuntu14.04安装并修复grub2
  2. 写程序是最轻松的事情
  3. python 自学需要多久-怎么自学python,大概要多久?
  4. [并发编程] - Executor框架#ThreadPoolExecutor源码解读02
  5. ssh中exit命令退出远程服务器_Linux:ssh远程执行命令并自动退出
  6. 数据库系统概念总结:第八章 关系数据库设计
  7. Anaconda+vscode+pytorch环境搭建
  8. fetch jsonp连接mysql_fetch跨域浏览器请求头待研究
  9. 如何选择数据分析工具
  10. java.lang.ClassFormatError
  11. C++中带默认参数的函数定义及使用总结
  12. Glide4.0 centerCrop属性和圆角 冲突
  13. Kettle构建Hadoop ETL实践(八-2):维度表技术
  14. 苹果和虫子c语言编程题,虫子吃苹果:每天10分钟,锻炼少儿编程计算思维
  15. 消息称GPhone今日发布 揭秘幕后教父(图)
  16. 基于51单片机无线门铃控制系统设计(毕设课设)
  17. netcat网工必备工具
  18. CString、CStringA 和 CStringW
  19. 一张A4纸对折不了8次?
  20. 最佳开源应用程序:图形/图像处理软件

热门文章

  1. linux下网速测试
  2. 2019年云架构和云计算趋势如何?|中机智库干货
  3. CSR8675项目实战:BlueHiFi蓝牙音乐收发器
  4. 互联网早报 | 小米11正式发布;东风启辰重回东风日产旗下;作业帮完成新一轮超16亿美元融资...
  5. 2022第一位华为“天才少年”!绩点1.8逆袭!
  6. 澳禁止华为参与5G网络建设;锤子将编写自己的OS;国产处理器兆芯可运行Windows,已试制出Intel i5级处理器丨Q新闻...
  7. 【影评-转自豆瓣】疯狂原始人
  8. 单商户商城系统功能拆解26—营销中心—限时秒杀
  9. 【软件网每日新闻播报│第9-25期】
  10. SQL SERVER 表变量 和 标量变量