zoukankan      html  css  js  c++  java
  • 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文档链接:https://razorpay.com/docs/api/

    博客书写不易,转载请注明出处!

  • 相关阅读:
    第四次博客作业结对项目
    centos7 python3 安装paramiko模块
    zabbix启动报错:“No space left on device: AH00023”
    zabbix监控历史数据清理过程
    zabbix:登录页面是显示Database:Error connecting to database: Access denied for user 'zabbix' @ 'localhost'
    解决:Linux漏洞目标主机showmount e信息泄露(CEE19990554)
    关于Sentaurus的日常(二)(Carrier Transport Models)
    SQLITE3
    Dos命令大全完整版
    四级菜单实现(Python)
  • 原文地址:https://www.cnblogs.com/kuanglongblogs/p/14074524.html
Copyright © 2011-2022 走看看