这里写目录标题

  • 环境准备
    • 1.注册paypal账户
    • 2.登录开发者中心
    • 3.创建沙箱账户
    • 4.在沙箱模式创建一个app,平台默认创建好了一个
      • 4.1填写信息
      • 4.2绑定某个沙箱账号
      • 4.3Client ID及Secret
  • 支付代码
    • 1.pom
    • 2.实例化配置
    • 3.支付订单
      • 3.1用sandbox的personal的账号登录,并支付
    • 4.支付成功&失败
    • 5.退款

环境准备

1.注册paypal账户

PayPal官方

2.登录开发者中心

PayPal开发者中心

3.创建沙箱账户

Business为收款账号,Personal为付款账号,平台默认创建好了两个账号


这里显示的 账户和密码,支付的时候用

4.在沙箱模式创建一个app,平台默认创建好了一个

4.1填写信息

类型:

Merchant-仅为自己收款

Platform-作为平台收款,可分账给卖家

4.2绑定某个沙箱账号

4.3Client ID及Secret

进入app详细页面,查看Client ID及Secret(后续需填写到代码中)

支付代码

1.pom

 <dependency><groupId>com.github.javen205</groupId><artifactId>IJPay-All</artifactId><version>2.9.3</version></dependency>

2.实例化配置

public PayPalApiConfig getConfig() {PayPalApiConfig config = new PayPalApiConfig();config.setClientId(payPalBean.getClientId());config.setClientSecret(payPalBean.getSecret());config.setSandBox(payPalBean.getSandBox());config.setDomain(payPalBean.getDomain());PayPalApiConfigKit.setThreadLocalApiConfig(config);return config;
}

3.支付订单

 private final static String RETURN_URL = "/center/pay/order/successUrl";private final static String CANCEL_URL = "/center/pay/order/cancelUrl";
/*** @return void* @params []* @Author* @Date* @Description: 支付订单*/public void index() {String id = get("id");if (StrKit.isBlank(id)) {//re("订单id未提供");return;}BusOrder target = BusOrder.dao.template("order.find", Kv.by("id", id)).findFirst();if (target == null) {//re("订单不存在");return;}String pay_method = target.getPayMethod();try {PayPalApiConfig config = getConfig();//参数请求参数文档 https://developer.paypal.com/docs/api/orders/v2/#orders_createMap<String, Object> dataMap = new HashMap<>();dataMap.put("intent", "CAPTURE");//不改ArrayList<Map<String, Object>> list = new ArrayList<>();Map<String, Object> amount = new HashMap<>();amount.put("currency_code", "USD");//美元double actualPrice = NumberUtil.mul(target.getActualPrice() + "", "1").doubleValue();amount.put("value", actualPrice);//实际付款Map<String, Object> itemMap = new HashMap<>();itemMap.put("amount", amount);list.add(itemMap);dataMap.put("purchase_units", list);Map<String, String> applicationContext = new HashMap<>();applicationContext.put("cancel_url", config.getDomain().concat(CANCEL_URL) + "?id=" + target.getId() + "&user=" + getHeader("userCode"));//失败跳转地址applicationContext.put("return_url", config.getDomain().concat(RETURN_URL));//成功后跳转地址applicationContext.put("brand_name", "test");//品牌名称//applicationContext.put("logo_url", "");//付款方式徽标的 URLdataMap.put("application_context", applicationContext);String data = JSONUtil.toJsonStr(dataMap);log.info(data);IJPayHttpResponse resData = PayPalApi.createOrder(config, data);log.info(resData.toString());if (resData.getStatus() == 201) {String resultStr = resData.getBody();cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(resultStr);//System.out.println(jsonObject);target.setOrderThirdId(jsonObject.getStr("id"));target.update();JSONArray links = jsonObject.getJSONArray("links");for (int i = 0; i < links.size(); i++) {JSONObject item = links.getJSONObject(i);String rel = item.getStr("rel");String href = item.getStr("href");if ("approve".equalsIgnoreCase(rel)) {// redirect(href);rsPara("支付地址获取成功", Kv.by("href", href));//支付地址 提交给前端return;}}}re("支付失败");return;} catch (Exception e) {e.printStackTrace();}}

3.1用sandbox的personal的账号登录,并支付

4.支付成功&失败

 //支付成功public void successUrl() {getPageStore("orderResult");String token = get("token");String payerId = get("PayerID");BusOrder target = BusOrder.dao.template("order.find", Kv.by("order_third_id", token)).findFirst();//确认付款log.info("token:" + token);log.info("payerId:" + payerId);PayPalApiConfig config = getConfig();IJPayHttpResponse response = PayPalApi.captureOrder(config, token, "");com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(response.getBody());if (response.getStatus() == 201 && jsonObject.getString("status").equals("COMPLETED")) {target.setPayTime(DateUtil.now());target.setCallbackJson(response.getBody());target.setState("2");target.update();rs("支付成功,跳转页面");redirect(config.getDomain() + "/center/order/getOrders");return;}setAttr("status", response.getStatus());render("/order/result.html");}//未支付 返回public void cancelUrl() {//String readData = HttpKit.readData(getRequest());/* System.out.println(readData);rs(readData);*/// PayPalApiConfig config = getConfig();String userCode = get("user");BusUser log_user = Redis.use().get(RedisHeader.USER_LOGIN_CODE + userCode);if (log_user == null) {//re("");render("/");return;}String id = get("id");BusOrder target = BusOrder.dao.template("order.find", Kv.by("id", id)).findFirst();/*String token = get("token");BusOrder target = BusOrder.dao.template("order.find", Kv.by("order_third_id", token)).findFirst();*/setAttr("orderObj", target);getPageStore("orderDetail");render("/order/order_detail.html");}

5.退款

/*** @return void* @params []* @Author* @Date* @Description: 退款订单*/public void refund() {com.alibaba.fastjson.JSONObject obj = getAttr("obj");String id = obj.getString("id");String refund_note = obj.getString("refund_note");BusOrder target = BusOrder.dao.template("order.find", Kv.by("id", id)).findFirst();if (target == null) {re("订单不存在");return;}try {com.alibaba.fastjson.JSONObject callbackJson = com.alibaba.fastjson.JSONObject.parseObject(target.getCallbackJson());//支付的时候给的jsonString captureId = callbackJson.getJSONArray("purchase_units").getJSONObject(0).getJSONObject("payments").getJSONArray("captures").getJSONObject(0).getString("id");PayPalApiConfig config = getConfig();Map<String, Object> map = new HashMap<>();String invoice_id = PayKit.generateStr();map.put("invoice_id", invoice_id);//退款编号map.put("note_to_payer", refund_note);//退款原因Map<String, String> amount = new HashMap<>();double v = NumberUtil.mul(target.getActualPrice() + "", "1").doubleValue();amount.put("value", v + "");amount.put("currency_code", "USD");map.put("amount", amount);String data = JSONUtil.toJsonStr(map);log.info("refund data:" + data);IJPayHttpResponse response = PayPalApi.refund(config, captureId, data);log.info(response.toString());if (response.getStatus() == 201) {target.setRefundTime(DateUtil.now());target.setState("5");target.setRefundNote(refund_note);target.setRefundInvoice(invoice_id);target.update();rs("Refund success");//redirect(config.getDomain() + "/center/order/getOrders");return;} else {re("Refund failure ");}return;} catch (Exception e) {e.printStackTrace();}}

jfinal整合IJPay paypal支付相关推荐

  1. 若依分离版整合IJpay实现第三方支付-(微信支付篇_v2)

    若依分离版整合IJpay实现第三方支付-(微信支付篇_v2) IJpay官网 https://javen205.gitee.io/ijpay/ 文章目录 若依分离版整合IJpay实现第三方支付-(微信 ...

  2. php paypal源码,PHP整合PayPal支付

    简单整理一下PHP项目整合PayPal支付功能. 一.表单的构建: 二.IPN验证部分 class paypal { var $ipn_data = array(); // array contain ...

  3. 「开源系统」IJPay 让支付触手可及封装了微信支付宝等支付

    介绍语 本号主要是Java常用关键技术点,通用工具类的分享:以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+d ...

  4. Android下集成Paypal支付

    近期项目需要研究paypal支付,官网上的指导写的过于复杂,可能是老外的思维和中国人不一样吧.难得是发现下面这篇文章: http://www.androidhive.info/2015/02/andr ...

  5. 聚合支付、单商户多商户支付、微信/支付宝/PayPal支付流程、支付政策法规

    目录 一.聚合支付 聚合支付的基本概念 如何选择合适的支付模式 政策相关 常见的聚合支付平台 二.多商户和单商户 多商户单商户区别 多商户入驻流程 多商户模式中常见的支付流程 普通支付 合单支付 留个 ...

  6. IJPay 让支付触手可及-文中有视频

    IJPay 让支付触手可及 GitHub:https://github.com/Javen205/IJPay Gitee:http://gitee.com/Javen205/IJPay JPay 是对 ...

  7. python paypal支付接口开发

    (第一次接触支付,理解可能也不是很深,欢迎批评指正) paypal是目前全球最大的在线支付工具,就像国内的支付宝一样,是一个基于买卖双方的第三方平台. PayPal API是基于HTTP的restfu ...

  8. JFinal整合CKFinder

    2019独角兽企业重金招聘Python工程师标准>>> 使用JFinal对之前的系统进行重构,老系统使用了CKEditor+CKFinder编辑器,发现在web.xml中配置Conn ...

  9. PAYPAL 支付,sandbox测试的时候遇到异常:请求被中止: 未能创建 SSL/TLS 安全通道,以及解决方法。...

    场景描述: 我公司的网站之前就已经开发好了下单支持paypal支付,当然,这个是其他同事开发的.前段时间,主管让我在另一个场景开发支持使用paypal支付,当时花了些时间看看关于paypal代码,然后 ...

最新文章

  1. Php基础数学运算篇
  2. 白话生成对抗网络 GAN,50 行代码玩转 GAN 模型!【附源码】
  3. 获取的输入内容,没有被P标签包裹的文本和元素进行处理
  4. 1005 矩阵快速幂
  5. mysql 5.7 源码编译安装_mysql-5.7.*源码编译安装
  6. java下载文件名乱码的解决方法
  7. webstorm如何支持markdown
  8. 从事三年java开发后, 我打算转人工智能
  9. 【秋招面经】全网最全大华前端题目总结
  10. ARM-LINUX平台下的文本文件打印机打印
  11. 数学建模更新7(ARCH和GARCH模型)
  12. C++打印机首选项设置
  13. jeecgboot自动关闭本页标签Tab页
  14. Mandriva 2009 Spring PWP中3D桌面的使用
  15. computed vue 不 触发_vue computed 无法触发 set
  16. 计算机打字失灵,电脑键盘在打字的时候出现按键失灵的原因是什么
  17. 计算机服务器机房 消防灭火,服务器机房消防系统和维护
  18. 数独解题思路——求解数独
  19. 大师系列彼•奇层查股
  20. java浏览器无界面后台截屏工具

热门文章

  1. Python 可视化如何配色?这个工具你值得拥有
  2. 在大厂呆过多年的35岁“大龄”程序猿,聊聊35岁以上的程序猿们都干什么去了
  3. ClasspathResource路径问题解决
  4. 防火墙、IDS(入侵检测系统)与双机热备
  5. 第七天 位置参数 变量运算if case || find locate compress
  6. 购买2019最佳性价比Android智能手表(smart watch)
  7. 安卓开发:怎样实时在百度地图上绘制运动轨迹?
  8. 《王者荣耀》皮肤个性动作涉嫌抄袭
  9. 芯准TSN系统的测试与验证(1)——测试环境配置
  10. java bidi_Java Bidi toString()用法及代码示例