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/

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

Razorpay支付对接,JAVA对接篇的更多相关文章

  1. Java对接拼多多开放平台API(加密上云等全流程)

    前言 本文为[小小赫下士 blog]原创,搬运请保留本段,或请在醒目位置设置原文地址和原作者. 作者:小小赫下士 原文地址:Java对接拼多多开放平台API(加密上云等全流程) 本文章为企业ERP(I ...

  2. Java提高篇——对象克隆(复制)

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  3. Java提高篇(三三)-----Map总结

    在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...

  4. Java提高篇(三二)-----List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...

  5. Java提高篇(三一)-----Stack

    在Java中Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的.每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stack通过 ...

  6. java提高篇(三十)-----Iterator

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...

  7. java提高篇(二九)-----Vector

    在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...

  8. Java提高篇(二八)------TreeSet

    与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...

  9. Java提高篇(二七)-----TreeMap

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

随机推荐

  1. Java基础知识(三)

    一.hashCode 与 equals (重要) 面试官可能会问你:"你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?" 1 ...

  2. 等效介质理论模型---利用S参数反演法提取超材料结构的等效参数

    等效介质理论模型---利用S参数反演法提取超材料结构的等效参数 S参数反演法,即利用等效模型的传输矩阵和S参数求解超材料结构的等效折射率n和等效阻抗Z的过程.本文对等效介质理论模型进行了详细介绍,并提 ...

  3. javascript-闭包【面试必备】

    闭包 定义:内层函数可以访问外层函数作用域的变量 意义/用途: 1.封装细节 2.实现模块化 3.常用实战li列表 // querySelectorAll es5支持的一个类似于jq的复杂选择器选取d ...

  4. 01 . Vue简介,原理,环境安装

    简介 vue是一个JavaMVVM库,是一套用于构建用户界面的渐进式框架,是初创项目的首选前端框架.它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计.它是轻量级的,它有很多独立的功能或库 ...

  5. 数论总结——更新ing

    数论还是有很多没学完 只是小小的总结 一.同余定理 1.反身性:\(a\equiv a (mod m)\) 2.对称性:若\(a\equiv b(mod m)\),则\(b\equiv a (mod ...

  6. 面试都要问的Spring MVC

    MVC总结 1. 概述 还是之前的三个套路 1.1 是什么? Spring提供一套视图层的处理框架,他基于Servlet实现,可以通过XML或者注解进行我们需要的配置. 他提供了拦截器,文件上传,CO ...

  7. osd磁盘空间足够无法写入数据的分析与解决

    前言 这个问题的来源是ceph社区里面一个群友的环境出现在85%左右的时候,启动osd报错,然后在本地文件系统当中进行touch文件的时候也是报错,df -i查询inode也是没用多少,使用的也是in ...

  8. Python面试题_中级版

    Python 面试题 1.Python是如何进行内存管理的 对象引用机制.垃圾回收机制.内存池机制 1.1对象引用机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数. 引 ...

  9. 推荐一个学习SQL Server基本语法及其他编程的网站

    菜鸟们的练习场 1.领先的 Web 技术教程 在 w3school,你可以找到你所需要的所有的网站建设教程. 从基础的 HTML 到 CSS,乃至进阶的XML.SQL.JS.PHP 和 ASP.NET ...

  10. JavaScript正则学习笔记

    RegExp 元字符 ' . ' 点号:匹配任意的字符 ^ $ 位置字符 ^ 匹配字符串开始的位置 $ 匹配字符串结束的位置 匹配数字和非数字 \d 和 \D 匹配空白字符 \s 和 \S \s 匹配 ...