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. eyoucms破解授权/去版权插件

    插件描述:eyoucms内容管理系统的授权破解,可以去版权的插件,需要请自行关注. https://hbh.cool/find/136.html

  2. 记一次微信公众号(微信H5)网页对接腾讯云慧眼人脸核验开发笔记

    需求是这样的,客户需要一个在观看学习视频前弹出人脸识别核验真人的功能,客户找了个APP作为参考,但是在微信上第三方人脸识别是无法直接调取到前置摄像头的,都是通过用户自己获取用户的身份信息或者照片,然后 ...

  3. "!"的应用(以C++为例)

    1. "!"在条件语句中仅作逻辑判断使用并不影响变量的值 2. "!"在赋值类语句中会改变变量的值(非零->0,0->1)

  4. Java集合(类)框架(三)

    1. Map集合 相较于List和Set集合而言,Map集合所储存的数据为双列行,数据是以key和value为一个单位进行存储的,如在建立一个学生Map的时候,其中的数据应为 学号-姓名(key-va ...

  5. Java集合(类)框架(二)

    1.Set集合 1.1 HashSet集合 HashSet底层为哈希码 不是数组,因此没有下标的概念,也就不能根据下标来查询某个元素 存放元素无序,不可重复 1.1.1 声明 Set<Strin ...

  6. Cocos Creator 源码解读:引擎启动与主循环

    前言 预备 不知道你有没有想过,假如把游戏世界比作一辆汽车,那么这辆"汽车"是如何启动,又是如何持续运转的呢? 如题,本文的内容主要为 Cocos Creator 引擎的启动流程和 ...

  7. leetcode5:insertion-sort-list

    题目描述 使用插入排序对链表进行排序. Sort a linked list using insertion sort. 示例1 输入 复制 {3,2,4} 输出 复制 {2,3,4} // 插入排序 ...

  8. gitlab - 解决添加webhook提示Url is blocked: Requests to the local network are not allowed的问题

    问题背景 给项目添加 webhook 保存之后报错了 解决方案 进入 admin  area 进入 settings-network 保存设置后,重新进入项目并设置 webhook 保存即可成功

  9. vim编辑器的常用命令

    按ESC键跳到命令模式,然后::w - 保存文件,不退出 vim.:w file -将修改另外保存到 file 中,不退出 vim.:w! -强制保存,不退出 vim .:wq -保存文件,退出 vi ...

  10. tp3.2验证码

    切换验证码 document.getElementById('img_code_1').src="__URL__/verify/"+Math.random(1,9999); 生成验 ...