Razorpay支付對接,JAVA對接篇

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/

博客書寫不易,轉載請註明出處!