1、需求描述:
我们公司的系统现已有微信的支付扣费流程了,但是还没有支持支付宝支付,所以公司就想着对接一下支付宝,还想一步到位,直接搞个用户免密支付。不过要想对接支付宝的免密支付是对收款的支付宝账号
有要求的,需要改支付宝账号有连续3个月每日订单超过1000笔,或者是学校和某些公司的专用支付宝账号才可以开通的。
2、解决方案:
首先这种对接第三方系统的功能,一般都是先去对方官网寻找对接文档,通过对方的接口文档去接入自己的系统,这里支付宝对接免密支付的官方文档地址就是
opendocs.alipay.com/pre-open/20…
有需要的可以点进去看看,根据文档我总结了一下步骤,大概下面这些步骤。
1、用收款的支付宝账号在开放平台创建应用并获取APPID
2、创建商户支付宝公钥、私钥
3、配置应用(系统地址、开发设置、公钥、密钥)
圈出来都是必须要配置的
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…
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、最后
自此就完成一个最基本支付宝免密支付的对接流程,文档中其实还有很多扩展接口可以接入,你也可以根据实际需要选择接入,从而使自己的系统更加完善,对接支付宝相比对接其他平台还算相对简单的,各位小友不用怕。
以上就是对接支付宝免密支付全部内容了,希望可以帮助到你。。。