如何对接支付宝免密支付(商户代扣)

1,566 阅读4分钟

1、需求描述:

我们公司的系统现已有微信的支付扣费流程了,但是还没有支持支付宝支付,所以公司就想着对接一下支付宝,还想一步到位,直接搞个用户免密支付。不过要想对接支付宝的免密支付是对收款的支付宝账号 有要求的,需要改支付宝账号有连续3个月每日订单超过1000笔,或者是学校和某些公司的专用支付宝账号才可以开通的。

2、解决方案:

首先这种对接第三方系统的功能,一般都是先去对方官网寻找对接文档,通过对方的接口文档去接入自己的系统,这里支付宝对接免密支付的官方文档地址就是
opendocs.alipay.com/pre-open/20…

微信截图_20230129163752.png 有需要的可以点进去看看,根据文档我总结了一下步骤,大概下面这些步骤。

1、用收款的支付宝账号在开放平台创建应用并获取APPID
image.png

image.png

2、创建商户支付宝公钥、私钥
image.png 3、配置应用(系统地址、开发设置、公钥、密钥)
圈出来都是必须要配置的 image.png 4、提交上线应用审核(预计会有一个工作日的审核时间)
5、审核通过后把应用APPID提供给公司的支付宝BD(业务发展专员),让他帮助您在开放平台挂载 商户代扣 功能包(也是预计会有一个工作日的审核时间)
6、选择签约接入方式(SDK 独立签约接入、PC 转二维码独立签约接入、小程序独立签约接入三种,一般Java项目都是pom文件引入就行)
7、签约页面内容定制(需提供LOGO、服务名称、别名展示、商户服务描述等)
8、对接alipay.user.agreement.page.sign(协议签约)
以Java代码为例:

@RequestMapping(value="/agreement",method= RequestMethod.POST)
public void agreement(HttpServletRequest request, HttpServletResponse response, @RequestBody JSONObject param) throws AlipayApiException {
   JSONObject returnJson = new JSONObject();
   logger.error("#################  支付宝用户签约开始   ##################");

   logger.error("请求参数为:"+param);
   AlipayClient alipayClient = new DefaultAlipayClient(ALiPayConfig.serverUrl, ALiPayConfig.appId, ALiPayConfig.privateKey, ALiPayConfig.format, ALiPayConfig.charset, ALiPayConfig.aLiPublicKey, ALiPayConfig.signType);
   AlipayUserAgreementPageSignModel bizModel = new AlipayUserAgreementPageSignModel();
   bizModel.setPersonalProductCode("GENERAL_WITHHOLDING_P");
   bizModel.setProductCode("GENERAL_WITHHOLDING");
   bizModel.setSignScene("INDUSTRY|CATERING");
   //bizModel.setExternalAgreementNo (param.getString("userId"));
   bizModel.setExternalLogonId(param.getString("userId"));
   AccessParams accessParams = new AccessParams();
   accessParams.setChannel("ALIPAYAPP");
   bizModel.setAccessParams(accessParams);
   AlipayUserAgreementPageSignRequest AliRequest = new AlipayUserAgreementPageSignRequest();
   AliRequest.setBizModel(bizModel);
   String notifyUrl = "http://"+ALiPayConfig.occUrl+"/signupNotify";
   AliRequest.setNotifyUrl(notifyUrl);
   AlipayUserAgreementPageSignResponse AliResponse = alipayClient.pageExecute(AliRequest,"get");
   logger.error("相应结果为:"+AliResponse);
   String url = AliResponse.getBody();
   if(AliResponse.isSuccess()){
      returnJson.put("data",url);
      returnJson.put("msg", "成功进入签约");
      returnJson.put("code", "0000");
      returnJson.put("result", true);
      responseOutWithJson(response, returnJson);
   }else{
      logger.error("支付宝开通免密支付异常:"+ AliResponse);
      returnJson.put("msg", "支付宝开通免密支付异常");
      returnJson.put("code", "0001");
      returnJson.put("result", false);
      responseOutWithJson(response, returnJson);
   }
}

其中返回的url直接打开就是支付宝的签约页面

10、对接alipay.user.agreement.query(协议查询)

AlipayClientalipayClient=newDefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","yourprivate_key","json","GBK","alipay_public_key","RSA2");
    AlipayUserAgreementQueryModel bizModel = new AlipayUserAgreementQueryModel();
    // 如果有协议号,则bizModel不需要再填充其他参数
    bizModel.setAgreementNo("20204910000764331770");
    // 如果没有协议号,则bizModel还需填充以下参数
    bizModel.setPersonalProductCode("GENERAL_WITHHOLDING_P");
    bizModel.setSignScene("INDUSTRY|MULTIMEDIA");
    // 如果签约时传了外部签约号,查询也需要传
    bizModel.setExternalAgreementNo("u439878249");
    // 如果签约时没有传外部签约号,那需要传alipayUserId(支付宝用户id)或者alipayLogonId(支付宝登陆号)
    bizModel.setAlipayUserId("2088302237591705");
    bizModel.setAlipayLogonId("13454985038");
    AlipayUserAgreementQueryRequest request = new AlipayUserAgreementQueryRequest();
    request.setBizModel(bizModel);
    AlipayUserAgreementQueryResponse response = alipayClient.execute(request);
    if(response.isSuccess()){
        System.out.println("调用成功");
    }else{
        System.out.println("调用失败");
    }

这里记得要获取支付宝用户的的信息才能操作,文档地址为opendocs.alipay.com/open/284/we…
image.png 11、对接alipay.trade.pay(交易支付)

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","yourprivate_key","json","GBK","alipay_public_key","RSA2");
    AlipayTradePayModel bizModel = new AlipayTradePayModel();
    // 交易信息
    bizModel.setTotalAmount("3.05");
    bizModel.setSubject("商品1");
    bizModel.setOutTradeNo("pay2308u4032");
    bizModel.setProductCode("GENERAL_WITHHOLDING");
    // 协议参数,其中填充协议号
    AgreementParams agreementParams = new AgreementParams();
    agreementParams.setAgreementNo("20180117469095072770");
    bizModel.setAgreementParams(agreementParams);
    AlipayTradePayRequest request = new AlipayTradePayRequest();
    request.setBizModel(bizModel);
    // 异步通知地址
    request.setNotifyUrl("https://www.merchant.com/receive_notify");
    AlipayTradePayResponse response = alipayClient.execute(request);
    if(response.isSuccess()){
        System.out.println("调用成功");
    }else{
        System.out.println("调用失败");
        }

系统接入支付金额和用户的签约号就可以完成免密支付了
12、对接alipay.trade.refund (交易退款)

AlipayClientalipayClient=newDefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","yourprivate_key","json","GBK","alipay_public_key","RSA2");
    AlipayTradeRefundModel bizModel = new AlipayTradeRefundModel();
    bizModel.setRefundAmount("2.73");
    // tradeNo 和 OutTradeNo 至少传一个
    bizModel.setTradeNo("2019112611001004680073956707");
    bizModel.setOutTradeNo("pay2308u4032");
    // 如果是部分退款,必须传outRequestNo,同一笔交易多次退款需要保证唯一
    bizModel.setOutRequestNo("298474059820489");
    // 退款原因
    bizModel.setRefundReason("协商退款");
    AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
    request.setBizModel(bizModel);
    AlipayTradeRefundResponse response = alipayClient.execute(request);
    if(response.isSuccess()){
        System.out.println("调用成功");
    }else{
        System.out.println("调用失败");
    }

3、最后

自此就完成一个最基本支付宝免密支付的对接流程,文档中其实还有很多扩展接口可以接入,你也可以根据实际需要选择接入,从而使自己的系统更加完善,对接支付宝相比对接其他平台还算相对简单的,各位小友不用怕。

以上就是对接支付宝免密支付全部内容了,希望可以帮助到你。。。