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提高篇系列博文保持一致 ...
随机推荐
- 这么设置Intellij IDEA,据说效率还不错~
显示工具条 (1)效果图 (2)设置方法 标注1:View–>Toolbar 标注2:View–>Tool Buttons 设置鼠标悬浮提示 (1)效果图 (2)设置方法File–> ...
- Django之富文本(获取内容,设置内容)
富文本 1.Rich Text Format(RTF) 微软开发的跨平台文档格式,大多数的文字处理软件都能读取和保存RTF文档,其实就是可以添加样式的文档,和HTML有很多相似的地方 图示 2.tin ...
- [Luogu P4173]残缺的字符串 ( 数论 FFT)
题面 传送门:洛咕 Solution 这题我写得脑壳疼,我好菜啊 好吧,我们来说正题. 这题.....emmmmmmm 显然KMP类的字符串神仙算法在这里没法用了. 那咋搞啊(或者说这题和数学有半毛钱 ...
- Mybatis 批量更新遇到的小问题
小问题 记一个开发过程中因为小细节的遗漏而引发的 "莫名其妙",公司中有个2B(to B)供应链项目,持久层用的是 JPA,这里我就不吐槽 JPA 了,这种 SQL 嵌入在代码里的 ...
- 蒲公英 · JELLY技术周刊 Vol.29: 前端智能化在阿里的那些事
蒲公英 · JELLY技术周刊 Vol.29 前端智能化是指借助于 AI 和机器学习的能力拓展前端,使其拥有一些超出现阶段前端能力的特性,这将是未来前端方向中一场重要的变革.目前各家互联网厂商都有自己 ...
- ansible快速部署cassandra3集群
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 是什么让我节省了60%的编码时间?使用MBG
MyBatis Generator简介 业务需求不断变更,数据库表结构不断修改,是我们逃不出的宿命.工欲善其事,必先利其器,是时候祭出神器了:MyBatis Generator(简称:MBG),它是一 ...
- [MIT6.006] 3. Insertation Sort, Mege Sort 插入排序,归并排序
关于第2节课<Models of Computation, Document Distance>由于内容过于简单,所以不在这里进行记录,它主要就是讲了Python很多操作是constant ...
- pandas.DataFarme内置的绘图功能参数说明
可视化是数据探索性分析及结果表达的一种非常重要的形式,因此打算写一个python绘图系列,本文是第一篇,先说一下pandas.DataFrame.plot()绘图功能. pandas.DataFram ...
- Charles mock数据详解
Charles是一款非常好用的代理工具,关于Charles的安装.破解.安装证书,连接手机代理等使用方法详见我之前的博客:https://www.cnblogs.com/feng0815/p/8043 ...