Razorpay支付对接,JAVA对接篇
- 2020 年 12 月 2 日
- 筆記
- razorpay, RazorpayX, razorpay支付对接
Razorpay 作为印度本土的一家支付公司,类似中国的支付宝 微信,本篇记录一下对接印度第三方支付公司
准备工作:
注册公司
申请Razorpay账号
申请正式环境
Razorpay工作台:
获取key_id key_secret 获取路径:工作台–>settings–>API Keys
配置webhooks(支付回调) 配置路径:工作台–>settings–>webhooks
图片示例:
java代码示例 以下为创建订单及客户支付完成后后续处理:
注意点:传入rzp的金额精度为分,如果支付为1卢比,前台传来,后台需要乘以100
————————–开始分割线————————————-
pom.xml文件加入依赖
<!--RazorPay start--> <dependency> <groupId>com.razorpay</groupId> <artifactId>razorpay</artifactId> <version>指定版本</version> </dependency> <!--RazorPay end-->
java程序:
//创建razorpay客户端 RazorpayClient createRazorpayClient() { String keyId = "razorpay仪表盘的key_id"; String keySecret = "razorpay仪表盘的key_secret"; if (StringUtils.isBlank(keyId) || StringUtils.isBlank(keySecret)) { throw new BaseException("Please specify API and Secret Key in configuration file"); } RazorpayClient razorpayClient = null; try { razorpayClient = new RazorpayClient(keyId, keySecret); } catch (RazorpayException e) { throw new BaseException("razorpayClient创建异常", e); } if (razorpayClient == null) { throw new BaseException("razor pay error"); } return razorpayClient; }
//创建本地订单和razorpay订单,关联订单 public PayDO createOrder(BigDecimal amount) { //省略部分业务逻辑,PayDO为本地支付类 //传入第三方的金额,精度为分所以要 乘以 100 BigDecimal razorPayAmount = amount.multiply(new BigDecimal("100")); //生成本地随机订单号 String orderNo = StringRandom.getNumberAndLetterRandom(10); RazorpayClient razorpayClient = createRazorpayClient(); Order order = null; try { //创建第三方订单 JSONObject orderRequest = new JSONObject(); orderRequest.put("amount", razorPayAmount); orderRequest.put("currency", "INR"); orderRequest.put("receipt", orderNo); orderRequest.put("payment_capture", false); order = razorpayClient.Orders.create(orderRequest); } catch (RazorpayException e) { logger.error(e.getMessage()); } if (order == null) { return BaseResponse.fail("razor order create error"); }
//订单关联,入库 PayDO payDO = new PayDO(); payDO.setOrderNo(orderNo); payDO.setThirdNo(order.get("id")); payDO.setAmount(amount); payDO.setStatus("支付中"); //插入数据库 int saveSuccess = save(payDO); if (saveSuccess <= 0) { //创建失败 return null; } logger.info("用户,创建支付订单成功,内部订单号:{},第三方订单:{}", orderNo, order.get("id")); return payDO; }
到达这一步,返回给前端如果成功,前端调起支付,等待客户支付
支付成功回调代码:
@GetMapping("/back/pay") public BaseResponse<PayDO> callBackHandelOrderStatus(@RequestParam Map<String,Object> requestJson){ return payService.handelOrderStatus(requestJson); }
public BaseResponse<PayDO> handelOrderStatus(Map<String, Object> requestJson) { if (requestJson == null) { return BaseResponse.fail("error params"); } String event = requestJson.get("event") == null ? null : requestJson.get("event").toString(); //不为空则为回调 if (StringUtils.isNotBlank(event)) { logger.info("支付回调:" + JsonUtils.toJSONString(requestJson)); JSONObject jsonObject = new JSONObject(JsonUtils.toJSONString(requestJson)); try { //获取rzp那边的id String orderId = jsonObject.getJSONObject("payload").getJSONObject("payment").getJSONObject("entity").getString("order_id"); if (StringUtils.isNotBlank(orderId)) { //通过rzp的id查询本地是否存在 PayDO payDO = getByOutNo(orderId); if (payDO != null) { if ("支付成功".equals(payDO.getStatus())) { //成功 return BaseResponse.success(); } //业务代码省略,文字说明 //再次校验rzp支付状态,如果为成功且本地为支付中,那么更新本地状态 return BaseResponse.success(); } } } catch (Exception e) { logger.error("支付回调处理异常", e); return BaseResponse.fail("error params"); } } }
此文只是简单的对接引导,如有业务需求,需要对接的可以联系我,rzp支付,rzpx提现均已经过实际场景检验,可定制开发
rzp 指 razorpay
rzpx 指 razorpayX
rzp文档链接://razorpay.com/docs/api/
博客书写不易,转载请注明出处!