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. 什么是 session 和 cookie

    cookie 大家应该都熟悉,比如说登录某些网站一段时间后,就要求你重新登录:再比如有的同学很喜欢玩爬虫技术,有时候网站就是可以拦截住你的爬虫,这些都和 cookie 有关.如果你明白了服务器后端对于 ...

  2. c# 表达式树(一)

    前言 打算整理c# 代码简化史系列,所以相关的整理一下,简单的引出一下概念. 什么是表达式树呢? 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的 ...

  3. solr 文档二

    SOLR 5.5.5文档 参考博文: http://blog.csdn.net/matthewei6/article/details/50620600 作者:毛平 时间:2018年1月15日 17:3 ...

  4. 论文阅读:Learning Attention-based Embeddings for Relation Prediction in Knowledge Graphs(2019 ACL)

    基于Attention的知识图谱关系预测 论文地址 Abstract 关于知识库完成的研究(也称为关系预测)的任务越来越受关注.多项最新研究表明,基于卷积神经网络(CNN)的模型会生成更丰富,更具表达 ...

  5. SpringBoot进阶教程(六十五)自定义注解

    在上一篇文章<SpringBoot进阶教程(六十四)注解大全>中介绍了springboot的常用注解,springboot提供的注解非常的多,这些注解简化了我们的很多操作.今天主要介绍介绍 ...

  6. border-radius编程练习1-3

    border-radius编程练习1-3 我们刚学了圆角的知识,那么我们运用圆角的知识来实现下图所要求的效果: 参考代码: <!DOCTYPE html> <html lang=&q ...

  7. maven pom.xml 报错

    首先介绍背景,在eclipse中导入一个maven的项目,在我之前的电脑上导入好用,在自己的电脑上导入居然pom报错了Missing artifact junit:junit:jar:4.11,还会有 ...

  8. Kubernetes笔记(六):了解控制器 —— Deployment

    Pod(容器组)是 Kubernetes 中最小的调度单元,可以通过 yaml 定义文件直接创建一个 Pod.但 Pod 本身并不具备自我恢复(self-healing)功能.如果一个 Pod 所在的 ...

  9. rbd的image快照与Pool快照

    前言 这个问题是不久前在ceph社区群里看到的,创建image的时候,当时的报错如下: 2016-12-13 23:13:10.266865 7efbfb7fe700 -1 librbd::image ...

  10. linux域名解析引起登陆慢

    linux域名解析引起登陆慢的问题在于,ssh去登录这个台机器的时候,本机会去通过域名解析获取登录主机的主机名,所有一旦域名解析是无效的,需要等待较长时间 解决办法一: 将域名解析指到127.0.0. ...