Springboot简单集成支付宝沙箱
本文章只为了记录springboot集成支付宝沙箱的简单用法,至于沙箱的注册登录就不叙述了,网上百度好多好多
先导入依赖
<!--支付宝-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.9.28</version>
</dependency>
接着是支付宝的工具类
@Data
@Component
public class AlipayTemplate {
private String app_id = "";
private String merchant_private_key = "";
private String alipay_public_key = "";
private String notify_url="http://425q0646p1.qicp.vip/order/payed/notify";
private String return_url="http://425q0646p1.qicp.vip/";
private String sign_type = "RSA2";
private String charset = "utf-8";
String time_out = "30m";
private String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
public String pay(Order order) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl,
app_id, merchant_private_key, "json",
charset, alipay_public_key, sign_type);
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(return_url);
alipayRequest.setNotifyUrl(notify_url);
String out_trade_no = order.getOrderNumber();
Double total_amount = order.getPayPrice();
String subject = order.getOrderName();
String body = "";
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"total_amount\":\""+ total_amount +"\","
+ "\"subject\":\""+ subject +"\","
+ "\"body\":\""+ body +"\","
+ "\"timeout_express\":\""+ time_out +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
String result = alipayClient.pageExecute(alipayRequest).getBody();
return result;
}
}
这里是配置类的位置。
只需将支付宝沙箱注册的APPID还有商户私钥和支付宝公钥填上就可以用了。 注意这里实现了一个Pay()方法,调用此方法时只需要传入order,然后把order的订单号,支付金额,名称等等等取出来,就可以自己生成一个支付页面了、 生成的界面如下:
接下来就是使用了,用法也非常的简单,先贴上生成订单的整个方法,只是做个参考,实际上只需要看最下面几行代码就行了。
@Autowired
private AlipayTemplate alipayTemplate;
@ResponseBody
@RequestMapping(value = "/createOrder", produces = "text/html;charset=utf-8")
public String createOrder(HttpServletRequest request, HttpServletResponse response, String address, String message) throws ServletException, IOException {
ModelAndView modelAndView = new ModelAndView();
User user = (User) request.getSession().getAttribute("user");
if (user != null) {
Order order = new Order();
Double payPrice = trolleyService.getCheckTrolleyPrice(user.getUid());
String orderNumber = getTime().replaceAll("[[\\s-:punct:]]", "") + user.getUid() + new Random().nextInt(100);
order.setUid(user.getUid());
order.setOrderNumber(orderNumber);
order.setOrderName("ll" + "deDD" + getSimpleTime().replaceAll("[[\\s-:punct:]]", ""));
order.setPayPrice(payPrice);
order.setAddress(address);
order.setMessage(message);
Integer b = orderService.createOrder(order);
Integer oid = order.getOid();
System.out.println("订单号oid=" + oid);
if (oid != 0) {
List<Trolley> trolleyList = trolleyService.getCheckTrolleyByTid(user.getUid());
for (Trolley trolley : trolleyList) {
Good good = goodService.findGoodById(trolley.getGid());
good.setCommentCount(good.getCommentCount() - trolley.getNum());
good.setSaleCount(good.getSaleCount() + trolley.getNum());
goodService.updateGood(good);
OrdersItem ordersItem = new OrdersItem();
ordersItem.setOid(oid);
ordersItem.setGid(good.getGid());
ordersItem.setGoodNum(trolley.getNum());
ordersItem.setGoodPrice(good.getNowPrice());
ordersItemService.createOrdersItem(ordersItem);
}
trolleyService.delTroCheckByUid(user.getUid());
Timer(String.valueOf(order.getOid()));
try {
return alipayTemplate.pay(order);
} catch (AlipayApiException e) {
e.printStackTrace();
}
}
}
return null;
}
这是大三写的一个项目,贴出代码只是给个参考,代码多low咱们就不管了,重点在于最后面几行,
try {
return alipayTemplate.pay(order);
} catch (AlipayApiException e) {
e.printStackTrace();
}
是的,这里传入order也就是订单相关的信息就行了,调用pay方法,就能返回到上面我们说的支付界面。 到此支付宝沙箱的集成已经完成一半了。 是的,1、导入依赖/2、支付宝配置类,3、调用。
接下来我们说说上面支付宝配置类的两个参数 好吧代码注释也说的够清楚了,上面那个是异步调用的url,当你支付成功后,支付宝就会请求这个url告诉你支付成功,所以这个方法一般就用来验签和实现支付成功后的一些逻辑
这里异步调用接口需要公网可以访问,如果经济不允许的情况下可以使用花生壳内网穿透工具: 网址:https://hsk.oray.com/ 我的个人配置:开通HTTP协议需要花费6元永久域名
下面的同步通知就是支付成功后要跳转的页面。 接下来贴上异步通知的方法
@ResponseBody
@PostMapping("/payed/notify")
public String handleAliPayed(PayAsyncVo payAsyncVo, HttpServletRequest request) throws AlipayApiException, UnsupportedEncodingException {
HashMap<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
valueStr = new String(valueStr.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
params.put(name, valueStr);
}
boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayTemplate.getAlipay_public_key(), alipayTemplate.getCharset(), alipayTemplate.getSign_type());
if (signVerified) {
System.out.println("支付成功");
return orderService.handlePayResult(payAsyncVo);
}
System.out.println("check失败");
return "false";
}
这里需要动的代码也不多,几乎都可以拿来直接用,需要改的就是下图的代码,当验签成功后,就可以走支付成功后的逻辑了, 什么更改订单状态啊 保存订单流水啊巴拉巴拉巴拉的该怎么干怎么干。 需要注意的就是 这里的返回值,如果代码执行完需要返回一个success,支付宝就会一直请求这个url,直到你告诉他成功了。 不然就会发三天三夜?(同学告诉我的我没试过) 嗯 没然后了,这里的代码几乎都是拿过来就可以直接用,需要换的地方好像都说清楚了。 生成订单的代码写的很low很low别骂了别骂了,我不听不听王八念经。
总结一下: 1.导入依赖 2.贴上支付宝配置类,修改配置类的私钥公钥和appid,还有同步回调和异步回调的url。 3.调用alipayTemplate的pay方法,往里面传入订单参数。(订单号,订单价格,订单名称等) 4.实现异步回调(支付成功)url的方法,支付宝验签。。
完。
哦对了对了,如果支付界面没出来,可以复制那个pay方法的return值,复制到记事本,然后改成html打开试试,那个就是你们想要的支付界面。
|