引入SDK:
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core --><dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.1.1</version></dependency><dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-green</artifactId> <version>3.2.0</version></dependency><!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --><dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version></dependency><dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.0.0</version></dependency>
预支付订单:
public Map<String,Object> alipay(NyOrder order) { //实例化客户端 AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);//此处的SIGN_TYPE是"RSA2"算法 //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody("xxxxx"); //商品描述 model.setSubject("xxxxx"); // 商品标题 // 雪花算法生成订单号 String tradeNo = String.valueOf(SnowFlake.getSnowFlake().nextId()); model.setOutTradeNo(tradeNo); //订单号 model.setTimeoutExpress("30m");// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。注:若为空,则默认为15d。 model.setTotalAmount(order.getAmount().toString());//订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000] /*model.setProductCode("xxxxxx");*///销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY model.setSellerId(SELLER_ID); request.setBizModel(model); request.setNotifyUrl(NOTIFY_URL);//支付宝异步调用后台的url // 创建订单 NyOrder nyOrder = new NyOrder(); // 雪花算法生成主键id nyOrder.setId(String.valueOf(SnowFlake.getSnowFlake().nextId())); nyOrder.setOrderNum(tradeNo); nyOrder.setAmount(new BigDecimal(order.getAmount().toString())); nyOrder.setPayType((byte) 1); nyOrder.setUserId(order.getUserId()); NyUser nyUser = nyUserService.queryUserInfoByUserId(order.getUserId()); if (null != nyUser) { nyOrder.setCpsInviteCode(nyUser.getCpsInviteCode()); } else { nyOrder.setCpsInviteCode(""); } nyOrder.setNCoin(new BigDecimal(order.getAmount().toString()).multiply(new BigDecimal(selfPropertiesUtil.getRmbTransferNCoinRation())).intValue()); LOGGER.info("开始生成订单..."); nyOrderService.addUserOrder(nyOrder); LOGGER.info("生成订单完成!"); try { //这里和普通的接口调用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); // System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。 Map<String,Object> map=new HashMap<>(); map.put("alisign",response.getBody());//前端是拿到此数据唤起支付 map.put("tradeNo",tradeNo); //此处将订单返回给前端,前端拿到此订单号再进行查一遍 return map; } catch (AlipayApiException e) { e.printStackTrace(); PayCommonUtil.saveLog("/opt/ny/logs/aliay.txt", e.getErrMsg()); return null; } }回调
@PostMapping(value = "/alipayNotify")@ResponseBodypublic Invoke AlipayCallBack(HttpServletRequest request) throws Exception { LOGGER.info("开始回调..."); Map<String, String> params = new HashMap<String, String>(); Map requestParams = request.getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } params.put(name, valueStr); } String notify_id = request.getParameter("notify_id"); String notify_type= request.getParameter("notify_type"); // 商户订单号 String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8"); String trade_status = request.getParameter("trade_status"); // 支付宝交易号 String out_trade_no = request.getParameter("out_trade_no"); if (notify_id != "" && notify_id != null) { if (notify_type.equals("trade_status_sync")){ int exeCount=0; // 验签 boolean flag = AlipaySignature.rsaCheckV1(params, AliPayServiceImpl.ALIPAY_PUBLIC_KEY, "UTF-8", "RSA2");//对RSA2进行验签 if (true==flag && trade_status.equals("TRADE_SUCCESS")) { //成功后执行的业务 LOGGER.info("TRADE_SUCCESS进入业务执行代码"); exeCount = aliPayService.notifyExe(trade_no,out_trade_no); LOGGER.info("TRADE_SUCCESS执行结果"); } if(exeCount>0){ return Invoke.success(0,"xxxxx",null); }else{ return Invoke.success(-1,"xxxxx",null); } } } return Invoke.success(0,"xxxxx",null); }主要的部分:阿里验签参数配置:
配置按照支付宝管理后台申请的 配置就可但是有点区别也是 比较坑的一点是:其中绿色框是 验签 工具生成的私钥 紫色框 是 支付宝管理平台的 支付宝公钥(不是应用公钥哦!!!!!切记) 如下图
应该公钥是 验签 工具生成的对应的 商户应用公钥 (开放平台秘钥 查看支付宝公钥 貌似是不能修改的)
支付宝管理后台 的开放平台秘钥--》RSA(SHA256)-->查看应用公钥就是上图验签工具的 商户应用公钥PS:(支付宝配置 私钥 公钥 使用验签工具生成 同时 公钥要在支付宝管理后台设置 其余的不用操作引入支付宝SDK 在配置AliConfig的时候 其中里面的私钥是 验签工具生成的私钥 公钥是支付宝公钥(切忌不是应用公钥))坑: 就是验签部分具体:1.下载验签工具2.生成秘钥(如上图商户应用私钥,商户应用公钥)3.商户应用私钥复制黏贴在AlipayConfig的app_private_key字段,商户应用公钥复制黏贴在 支付宝管理平台--》开放平台秘钥--》RSA(SHA256)查看应用公钥中4.复制黏贴 支付宝管理平台--》开放平台秘钥==》查看支付宝公钥 放在AlipayConfig的alipay_public_key 字段5.预支付的时候 需要加签
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); 其中SIGN_TYPE为RSA2 其余的参数 按照申请的管理平台自行配置6.回调的时候验签
AlipaySignature.rsaCheckV1(params, AliPayServiceImpl.ALIPAY_PUBLIC_KEY, "UTF-8", "RSA2");
原文地址:https://www.cnblogs.com/austinspark-jessylu/p/11317684.html
时间: 2024-10-29 17:22:05