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/
博客書寫不易,轉載請註明出處!