一、首先在官方接口文档中添加对应的配置,下载地址: https://opendocs.alipay.com/open/54/106370/
如果是maven项目可以直接在pom文件中添加如下依赖即可:
<!--支付宝sdk--> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.0.0</version> </dependency>
二、打开支付宝开放平台,找到沙箱完成里面的各项配置(应用公钥、支付宝公钥、应用私钥)
控制台首页:
沙箱环境:
应用网关地址为后台接收异步通知的url,接口内容加密方式设置为添加即可
三、添加AliPay支付配置类,AliDevPayConfig
package com.sports.user.config; /** * @ClassName: AliPayConfig * @Description: 需要传给支付宝SDK的公共基本参数 */ public class AliDevPayConfig { /** * 1.商户appid */ public String APPID = ""; /** * 私钥 pkcs8格式的 */ public static String RSA_PRIVATE_KEY =""; /** * 3.支付宝公钥 */ public static String ALIPAY_PUBLIC_KEY = ""; /** * 4.服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 */ public static String notify_url = ""; /** * 5.页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址 */ public static String return_url = ""; /** * 正式环境支付宝网关,如果是生产环境需更改成https://openapi.alipay.com/gateway.do */ public static String URL = "https://openapi.alipaydev.com/gateway.do"; /** * 7.编码 */ public static String CHARSET = "UTF-8"; /** * 私钥 pkcs8格式的 */ // 8.返回格式 public static String FORMAT = "json"; /** * //签名方式 加密类型 */ public static String SIGNTYPE = "RSA2"; }
四、编写后端代码,controller、service、serviceImpl(前端请求调起支付时)
controller中:生成字符串返回给前端去调用支付宝支付接口
String orderString = usrPayService.orderString(usrPayDO);
service中:
public String orderString(UsrPayDO usrPayDO);
serviceImpl中:
@Override public String orderString(UsrPayDO usrPayDO) { String orderString = "";//这个字符串是用来返回给前端的 log.info("==================支付宝下单,商户订单号为:" + usrPayDO.getId()); try { AliDevPayConfig aliDevPayConfig = new AliDevPayConfig(); //实例化上面的那个配置类.. //实例化客户端(参数:网关地址、商户appid、商户私钥、格式、编码、支付宝公钥、加密类型),为了取得预付订单信息 AlipayClient alipayClient = new DefaultAlipayClient(AliDevPayConfig.URL, aliDevPayConfig.APPID, AliDevPayConfig.RSA_PRIVATE_KEY, AliDevPayConfig.FORMAT, AliDevPayConfig.CHARSET, AliDevPayConfig.ALIPAY_PUBLIC_KEY, AliDevPayConfig.SIGNTYPE); //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay AlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest(); //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); //业务参数传入,可以传很多,参考API //model.setPassbackParams(URLEncoder.encode(request.getBody().toString())); //公用参数(附加数据) //对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。 model.setBody(usrPayDO.getDescription()); //商品名称 model.setSubject(usrPayDO.getTag()); //商户订单号,己方生成且值唯一的订单号 model.setOutTradeNo(usrPayDO.getId()); //交易超时时间 model.setTimeoutExpress("30m"); //支付金额 小数点后不能超过2位 model.setTotalAmount(String.valueOf(usrPayDO.getPayAmt())); //销售产品码(固定值) model.setProductCode("QUICK_MSECURITY_PAY"); ali_request.setBizModel(model); //异步回调地址(后台) ali_request.setNotifyUrl(AliDevPayConfig.notify_url); log.info("====================异步通知的地址为:" + ali_request.getNotifyUrl()); //同步回调地址(APP) ali_request.setReturnUrl(AliDevPayConfig.return_url); log.info("====================同步通知的地址为:" + ali_request.getReturnUrl()); // 这里和普通的接口调用不同,使用的是sdkExecute //返回支付宝订单信息(预处理) AlipayTradeAppPayResponse alipayTradeAppPayResponse = alipayClient.sdkExecute(ali_request); //就是orderString 可以直接给APP请求,无需再做处理。 orderString = alipayTradeAppPayResponse.getBody(); System.out.println(orderString); } catch (AlipayApiException e) { e.printStackTrace(); log.info("与支付宝交互出错,未能生成订单!"); } return orderString; }
五、编写后端代码,controller、service、serviceImpl(支付宝异步通知支付结果时)
controller中:
/** * 支付宝支付成功后.异步请求该接口 * * @param request * @return */ @ApiOperation("支付宝充值") @RequestMapping(value = "/aliPay", method = RequestMethod.POST) public @ResponseBody String aliPay(HttpServletRequest request, HttpServletResponse response) throws IOException { System.out.println("=支付宝异步返回支付结果开始"); //1.从支付宝回调的request域中取值 //获取支付宝返回的参数集合 Map<String, String[]> aliParams = request.getParameterMap(); //用以存放转化后的参数集合 Map<String, String> conversionParams = new HashMap<String, String>(); for (Iterator<String> iter = aliParams.keySet().iterator(); iter.hasNext(); ) { String key = iter.next(); String[] values = aliParams.get(key); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } // 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化 //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "UTF-8"); conversionParams.put(key, valueStr); } log.info("=============返回参数集合:{}", conversionParams); String status = usrPayService.aliPay(conversionParams); return status; }
service中:
public String aliPay(Map<String, String> conversionParams);
serviceImpl中:
/** * 验证支付宝返回通知 * * @param conversionParams * @return */ @Override public String aliPay(Map<String, String> conversionParams) { log.info("=支付宝异步请求逻辑处理="); //签名验证(对支付宝返回的数据验证,确定是支付宝返回的) boolean signVerified = false; try { //调用SDK验证签名 String alipayPublicKey = AliDevPayConfig.ALIPAY_PUBLIC_KEY; String charset = AliDevPayConfig.CHARSET; String signType = AliDevPayConfig.SIGNTYPE; signVerified = AlipaySignature.rsaCheckV1(conversionParams, alipayPublicKey, charset, signType); //首先对通知中的商家ID号进行本地验证 String getQxbOrderId = conversionParams.get("out_trade_no"); UsrPayDO usrPayDO = usrPayService.getById(getQxbOrderId); //对验签进行处理. if (signVerified != false && usrPayDO != null) { log.info("支付宝回调签名认证成功--------------------"); //验签通过 获取交易状态 String tradeStatus = conversionParams.get("trade_status"); //只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。 if (tradeStatus.equals("TRADE_SUCCESS") || tradeStatus.equals("TRADE_FINISHED")) { //此处可以进行一些本地的表操作,根据自己业务需求添加 log.info("验证成功,修改订单信息:{}-----------------", usrPayDO); } else { return "fail"; } return "success"; } else { return "fail"; } } catch (AlipayApiException e) { log.info("+++验签失败 !+++"); e.printStackTrace(); } return "fail"; }
提示支付宝发送异步通知后,以接收返回结果为准,接收到反馈结果后,则支付宝方的验证凭证ID则会失效,否则会在25小时内发送8次异步通知;
标签:支付宝,String,接入,APP,request,AliDevPayConfig,usrPayDO,public From: https://www.cnblogs.com/Gengzh/p/16880855.html