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/
博客书写不易,转载请注明出处!
Razorpay支付对接,JAVA对接篇的更多相关文章
- Java对接拼多多开放平台API(加密上云等全流程)
前言 本文为[小小赫下士 blog]原创,搬运请保留本段,或请在醒目位置设置原文地址和原作者. 作者:小小赫下士 原文地址:Java对接拼多多开放平台API(加密上云等全流程) 本文章为企业ERP(I ...
- Java提高篇——对象克隆(复制)
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- Java提高篇(三三)-----Map总结
在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...
- Java提高篇(三二)-----List总结
前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...
- Java提高篇(三一)-----Stack
在Java中Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的.每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stack通过 ...
- java提高篇(三十)-----Iterator
迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...
- java提高篇(二九)-----Vector
在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...
- Java提高篇(二八)------TreeSet
与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...
- Java提高篇(二七)-----TreeMap
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...
随机推荐
- c++11-17 模板核心知识(二)—— 类模板
类模板声明.实现与使用 Class Instantiation 使用类模板的部分成员函数 Concept 友元 方式一 方式二 类模板的全特化 类模板的偏特化 多模板参数的偏特化 默认模板参数 Typ ...
- 第一行代码中RecyclerView添加依赖库问题
现在更新到 implementation 'com.android.support:recyclerview-v7:29.2.1' 记得点Sync Now来进行同步.
- 一步一步实现直播软件源码的RTMP推流流媒体服务
第一步:准备工具 OBS推流工具下载及配置可以参见:OBS推流工具 第二步:安装流媒体服务 Windows/Linux系统环境中搭建直播流媒体服务 极速安装,下载解压一键启动即可,支持Windows和 ...
- 【SpringBoot】13. logback日志记录
logback日志记录 Spring Boot 1.5.19.RELEASE 1.导入相关jar包 在spring-boot-starter-web 中已经包含 2.添加logback.xml配置文件 ...
- .NET 5 中的隐藏特性
前言 双十一当天 .NET 5 正式发布带来了很多的新特性和改进,个人觉得非常香,并且花了 10 分钟时间就把自己的 4 个 .NET Core 3.1 的项目升级到了 .NET 5,堪称无痛. 但是 ...
- C#泛型用法,附代码示列
C#中的泛型,大致有如下几种:泛型方法,泛型类,泛型接口,泛型委托,泛型约束等 使用泛型的好处一个是为了减少代码量,更主要的是能提高效率,不需要进行拆箱和装箱的操作. 下面是写的简单的例子,共勉,加深 ...
- 记在Linux上定位后台服务偶发崩溃的问题
问题描述 在最近的后台服务中,新增将某个指令的请求数据落盘保存的功能.在具体实现时,采用成员变量来保存请求消息代理头,在接收响应以及消息管理类释放时进行销毁.测试反馈,该服务偶发崩溃. 问题分析 测试 ...
- 内核crash>>>磁盘空间小 怎么处理
在内存发生panic时,需要把panic的日志保存下来.以方便日后进行分析. 一般主机为x86的时候,panic 使用 kdump保存log.由于它使用占用大量内存和硬盘.所以当磁盘空间不够时,就会遇 ...
- tcp输入数据 慢速路径处理 tcp_data_queue_ofo
tcp_data_queue_ofo 在新内核的实现中ofo队列实际上是一颗红黑树.在tcp_data_queue_ofo中根据序号,查找到合适位置,合并或者添加到rbtree中.同时设置dsack和 ...
- OLTP与OLAP分析与比较
(本文转载自Super_Mu的博客https://www.cnblogs.com/hhandbibi/p/7118740.html) 1.OLTP与OLAP的介绍 数据处理大致可以分成两大类:联机事务 ...