项目开发中用到的支付宝支付,常见的有电脑网站(PC)与APP端支付,本知识库记录这两种场景下Java后端需要做的工作
电脑网站:
官方api文档地址:https://docs.open.alipay.com/api_1/alipay.trade.page.pay
通过此文档可以查看创建交易所需的必传参数等
先导入阿里的第三方支付包,我们通过maven的方式:
<dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.7.26.ALL</version> </dependency>
大体流程:通过接受或创建的必传参数,调用阿里的sdk,成功时,阿里会返回一个form表单,后端将这个form表单以字符串的形式返回给前端,前端直接将form表单打印到页面,此form表单自己进行提交操作,跳转至支付页面。
Java后端代码:
public String aliPayPage(AlipayParams params) { AlipayClient alipayClient = new DefaultAlipayClient(url, appId, appPrivateKey, format, charset, alipayPublicKey, signType); AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl(params.getReturnUrl()); alipayRequest.setNotifyUrl(params.getNotifyUrl()); Map<String, Object> paramsMap = new HashMap<>(); paramsMap.put("out_trade_no", params.getOutTradeNo()); paramsMap.put("product_code", params.getProductCode()); paramsMap.put("total_amount", String.valueOf(params.getTotalAmount())); paramsMap.put("subject", params.getSubject()); String paramsStr = ObjectTranUtil.toJsonString(paramsMap); log.info("alipay page pay param--{}", paramsStr); String form = ""; alipayRequest.setBizContent(paramsStr); try { form = alipayClient.pageExecute(alipayRequest).getBody(); } catch (AlipayApiException e) { log.error("alipay exception: ", e); } return form; }
其中设置的returnUrl是同步的回调通知地址,前端传入,notifyUrl为异步通知地址,为后端的api接口,用于接收阿里的回调通知,是否支付成功。
APP端与电脑网站大体一致,不过返回的是一串字符串,直接返回给APP端,用于在手机上调起支付宝,这里采用setBizModel的方式
Java后端代码:
public String aliPayApp(AlipayParams params) { AlipayClient alipayClient = new DefaultAlipayClient(url, appId, appPrivateKey, format, charset, alipayPublicKey, signType); AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody(params.getBody()); model.setSubject(params.getSubject()); model.setOutTradeNo(params.getOutTradeNo()); model.setTotalAmount(String.valueOf(params.getTotalAmount())); model.setProductCode(params.getProductCode()); request.setBizModel(model); request.setNotifyUrl(params.getNotifyUrl()); AlipayTradeAppPayResponse response = new AlipayTradeAppPayResponse(); try { response = alipayClient.sdkExecute(request); } catch (AlipayApiException e) { log.error("alipay exception: ", e); } return response.getBody(); }
其中的一些坑:
首先是公钥,调起支付时,传的公钥其实是没有意义的,传错的也没事,主要是接受阿里回调通知时,做验签操作时,用到的公钥是支付宝公钥而不是商户的应用公钥,具体参数在支付宝开发平台可以获取
另外则是调起支付时,传递的金额字段,官方实例是数字类型,其实调用sdk时,必须传字符串类型,否则会报错
转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/25360.html


微信打赏

支付宝打赏
感谢您对作者Miya的打赏,我们会更加努力! 如果您想成为作者,请点我