springboot支付宝微信支付

每天多学一点点~
之前写好了一篇,不下心被覆盖的,我的锅。。。。下次写博客记得导出来!!!!
话不多说,这就开始吧…

文章目录

  • springboot支付宝微信支付
    • 1.下载官方的demo
    • 2.登陆蚂蚁金服官网,配置个人信息
    • 3.Natapp购买免费隧道,用于内外网穿透
    • 4.代码
    • 5.总结
    • 6.结语

1.下载官方的demo

重要的事情说三遍,官方demo很重要!!!
地址

官方demo对于每一种方法,每种回调都说的很清楚;

2.登陆蚂蚁金服官网,配置个人信息

蚂蚁金服开发者中心 https://openhome.alipay.com/platform/appDaily.htm

  1. 进入沙箱环境


2. 进入沙箱环境,配置AppkID等信息

密钥需要自己生成,appID和支付宝网关是已经给好的,网关有dev字样,表明是用于开发测试。点那个设置 可以下载生成公钥

  1. 配置密钥

    注意:

    点击上图的生成方法 下载 跟你系统对用的 程序,然后生成 相应的 密匙

    如果没有设置过,此时显示文本是"设置应用公钥",我这里是已经设置过得


查看你的公钥把 公钥的字符串 复制过去 AlipayConfig.java 里面

3.Natapp购买免费隧道,用于内外网穿透

地址


配置隧道端口

4.代码

  1. 代码结构


    博主这里为了方便,就用了jsp页面

  2. 支付代码展示

package com.example.demo.controller;import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.example.demo.config.AlipayConfig;
import com.example.demo.pojo.Orders;
import com.example.demo.pojo.Product;
import com.example.demo.service.OrdersService;
import com.example.demo.service.ProductService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;/*** @Classname AlipayController* @Description TODO* @Date 2019/3/21 20:40* @Created by 爆裂无球*/
@Controller
@RequestMapping("/alipay")
public class AlipayController {private static final Logger LOGGER = LoggerFactory.getLogger(AlipayController.class);@Autowiredprivate ProductService productService;@Autowiredprivate OrdersService ordersService;/*** 对应官方例子   alipay.trade.page.pay.jsp** @Title: AlipayController.java* @Description: 前往支付宝第三方网关进行支付* Copyright: Copyright (c) 2019* Company:FURUIBOKE.SCIENCE.AND.TECHNOLOGY* @Classname AlipayController* @Description notify_url 和 return_url 需要外网可以访问,建议natapp 内网穿透* @Date 2019/3/21 20:40* @Created by 爆裂无球*/@PostMapping("goAlipay")@ResponseBodypublic String goAlipay(String orderId, HttpServletRequest request, HttpServletRequest response) throws Exception {Orders order = ordersService.getOrderById(orderId);Product product = productService.getProductById(order.getProductId());//获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);//设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(AlipayConfig.return_url);alipayRequest.setNotifyUrl(AlipayConfig.notify_url);//商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = orderId;//付款金额,必填String total_amount = order.getOrderAmount();//订单名称,必填String subject = product.getName();//商品描述,可空String body = "用户订购商品个数:" + order.getBuyCounts();// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。String timeout_express = "10m";//例子去官方api找alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","+ "\"total_amount\":\"" + total_amount + "\","+ "\"subject\":\"" + subject + "\","+ "\"body\":\"" + body + "\","+ "\"timeout_express\":\"" + timeout_express + "\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");//请求String result = alipayClient.pageExecute(alipayRequest).getBody();return result;}/** 功能:支付宝服务器同步通知页面  return_url.jsp  return_url必须放在公网上* 日期:2017-03-30* 说明:* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*//*** @Title: AlipayController.     对应官方例子return_url.jsp    return_url必须放在公网上  回跳页面* @Description: 支付宝同步通知页面* Copyright: Copyright (c) 2019* @Classname AlipayController* @Description TODO* @Date 2019/3/22 01:31* @Created by 爆裂无球*/@RequestMapping("alipayReturnNotice")public String alipayReturnNotice(HttpServletRequest request, HttpServletRequest response, Map map) throws Exception {LOGGER.info("支付成功, 进入同步通知接口...");//获取支付宝GET过来反馈信息Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";}//乱码解决,这段代码在出现乱码时使用valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名//——请在这里编写您的程序(以下代码仅作参考)——if (signVerified) {//商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");//支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");//付款金额String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");// 修改叮当状态,改为 支付成功,已付款; 同时新增支付流水  这里放在 异步 业务 处理
//            ordersService.updateOrderStatus(out_trade_no, trade_no, total_amount);//页面  展示Orders order = ordersService.getOrderById(out_trade_no);Product product = productService.getProductById(order.getProductId());LOGGER.info("********************** 支付成功(支付宝同步通知) **********************");LOGGER.info("* 订单号: {}", out_trade_no);LOGGER.info("* 支付宝交易号: {}", trade_no);LOGGER.info("* 实付金额: {}", total_amount);LOGGER.info("* 购买产品: {}", product.getName());LOGGER.info("***************************************************************");map.put("out_trade_no", out_trade_no);map.put("trade_no", trade_no);map.put("total_amount", total_amount);map.put("productName", product.getName());} else {LOGGER.info("支付, 验签失败...");}//前后分离形式  直接返回页面 记得加上注解@Response  http://login.calidray.com你要返回的网址,再页面初始化时候让前端调用你其他接口,返回信息
//        String result = "<form action=\"http://login.calidray.com/?#/index/depreciation-scrap/depreciation\"  method=\"get\" name=\"form1\">\n" +
//                "</form>\n" +
//                "<script>document.forms[0].submit();</script>";
//
//        return result;//前后不分离的形式,直接返回jsp页面return "alipaySuccess";}/* ** 功能:支付宝服务器异步通知页面   对应官方例子 notify_url.jsp     notify_url必须放入公网* 日期:2017-03-30* 说明:* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。*************************页面功能说明*************************  制作业务处理* 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。* 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。* 如果没有收到该页面返回的 success* 建议该页面只做支付成功的业务逻辑处理,退款的处理请以调用退款查询接口的结果为准。*//*** @Title: AlipayController.java* @Description: 支付宝异步 通知  制作业务处理* Copyright: Copyright (c) 2017* Company:FURUIBOKE.SCIENCE.AND.TECHNOLOGY* @Description TODO* @Date 2019/3/22 01:45* @Created by 爆裂无球*/@RequestMapping(value = "/alipayNotifyNotice")@ResponseBodypublic String alipayNotifyNotice(HttpServletRequest request, HttpServletRequest response) throws Exception {LOGGER.info("支付成功, 进入异步通知接口...");//获取支付宝POST过来反馈信息Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";}//乱码解决,这段代码在出现乱码时使用
//          valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名//——请在这里编写您的程序(以下代码仅作参考)——/* 实际验证过程建议商户务必添加以下校验:1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)4、验证app_id是否为该商户本身。*/if (signVerified) {//验证成功//商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");//支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");//交易状态String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");//付款金额String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");if (trade_status.equals("TRADE_FINISHED")) {//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意: 尚自习的订单没有退款功能, 这个条件判断是进不来的, 所以此处不必写代码//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知} else if (trade_status.equals("TRADE_SUCCESS")) {//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://付款完成后,支付宝系统发送该交易状态通知// 修改叮当状态,改为 支付成功,已付款; 同时新增支付流水ordersService.updateOrderStatus(out_trade_no, trade_no, total_amount);//这里不用 查  只是为了 看日志 查的方法应该卸载 同步回调 页面 中Orders order = ordersService.getOrderById(out_trade_no);Product product = productService.getProductById(order.getProductId());LOGGER.info("********************** 支付成功(支付宝异步通知)查询 只是为了 看日志  **********************");LOGGER.info("* 订单号: {}", out_trade_no);LOGGER.info("* 支付宝交易号: {}", trade_no);LOGGER.info("* 实付金额: {}", total_amount);LOGGER.info("* 购买产品: {}", product.getName());LOGGER.info("***************************************************************");}LOGGER.info("支付成功...");} else {//验证失败LOGGER.info("支付, 验签失败...");}return "success";}}

代码注释很详细了;
所有支付代码,官方demo中都有,只不过官方demo是写在jsp页面中的,博主将其整合到springboot中

  1. 效果展示
    多提一句,沙箱钱包现在只支持安卓环境。。。
    同步回调和异步回调,上文已经说过了,做个内网映射。

进入沙箱账户页面

用沙箱钱包登陆账号密码

异步回调,可用于 逻辑业务处理,同步回调,用于跳转页面。
博主这里前后不分离,同步回调后直接返回页面。若前后分离,可以用form表单形式返回页面,代码中都有注释。

5.总结

之前博客是写好的,不小心覆盖了,记住,以后写好博客后注意导出!!!
看到评论区有同学想要完整的例子,博主这次特意将代码整理好全部放入码云
支付宝微信支付例子

有需要的可以参考一下。

6.结语

世上无难事,只怕有心人,每天积累一点点,fighting!!!

springboot整合支付宝微信支付案例+代码相关推荐

  1. springboot整合支付宝沙箱支付

    springboot整合支付宝沙箱支付 1.简介 支付宝开发平台地址:https://open.alipay.com/develop/sandbox/app 对于学生来说,目前网上确实没有比较统一而且 ...

  2. SpringBoot+Vue整合支付宝沙箱支付

    SpringBoot+Vue2整合实现支付宝沙箱支付 原创不易,转载请注明!!原创不易,转载请注明!!原创不易,转载请注明!!原创不易,转载请注明!!原创不易,转载请注明!! 在进行电脑网站开发时我们 ...

  3. SpringBoot整合支付宝支付接口 详解 (有源文件)

    目录 1.简介与支付接口运行原理 2.基本配置说明 3.支付接口实现 4.整合后沙箱测试 1.简介与支付接口运行原理 简介: 现在与钱有关的项目都离不开支付,现在就来介绍一下如何对接支付宝接口.演示项 ...

  4. SpringBoot整合支付宝之电脑网站支付

    SpringBoot整合支付宝之电脑网站支付 一.支付宝介绍 1.2 过程分析 1.3 对接支付宝的准备工作 1.4 申请步骤: 2.支付功能实现 2.1 思路分析 2.2 编写支付宝支付接口 2.2 ...

  5. springboot 小程序微信支付

    参考文章:SpringBoot + 小程序 整合微信支付和退款 V2版 - 码农教程 本文仅作记录 参考文章: UniApp + SpringBoot 实现微信支付和退款 - 奔跑的砖头 - 博客园 ...

  6. Springboot整支付宝网站支付、APP支付、单笔转账给用户、退款功能

    一.概述 最近在写项目,遇到了要调用支付宝支付的地方(后台管理页面的网站支付,APP内的用户支付,APP内用户提现也就是单笔转账给用户.退款).研究了好久,全部调通了,下面把我的代码分享出来. 首先那 ...

  7. 【安卓学习之第三方库】 Rxpay学习:支付宝微信支付

    █ [安卓学习之第三方库] Rxpay学习:支付宝微信支付 █ 相关文章: [安卓学习之第三方库]库的使用2-jar类库的使用(以dom4j为例)和升级(以极光推送为例) [安卓学习之第三方库] 消息 ...

  8. asp php微信支付,Asp微信支付接口代码 微信中生成订单后可以直接调出微信钱包直接付款_随便下源码网...

    Asp微信支付接口代码 微信中生成订单后,可以直接调出微信钱包直接付款 软件介绍: 众所周到,目前微信支付已经十分普及,无论是商场.超市.网站上,微信支付的发展十分迅速,而ASP版微信支付在微信公众平 ...

  9. php调用支付宝微信支付接口 免签约 实测能用

    找了很多支付宝微信支付收款的办法,接入的时候发现根本不靠谱,终于实测到了一个可以用的,(验证效果不用改代码,php环境下Demo.php直接打开看就行了 附件放在下面了) 支付宝收款实测有效,微信支付 ...

最新文章

  1. 开源神经网络框架Caffe2全介绍
  2. 改变文件的所有者和所在组
  3. python怎么安装pandas模块-windows下如何安装Python、pandas
  4. JavaScript获取URL参数
  5. GC算法-引用计数法
  6. [Java] ArrayList、LinkedList、Vector的区别
  7. 如何从0开始,搭建企业的实时数据中台?
  8. 安装libvirt管理套件(C/S架构模式,用户管理kvm虚拟机)
  9. 洛谷P1306 斐波那契公约数
  10. 少儿编程app排名_终于明白少儿编程软件哪个好
  11. cmd命令查询硬盘序列号,磁盘ID,MAC地址
  12. matlab如何释放内存,怎么能释放已经使用的内存
  13. Cadence 17.4 PSpice 学习笔记
  14. HammerDB造数报错
  15. MSF编码与upx加壳过杀软
  16. 软件研发模型和软件测试模型
  17. js实现中英文切换(jquery.i18n.js)
  18. python-day18(正式学习)
  19. 4G摄像头如何在定时抓拍下实现超低功耗-技术贴
  20. android sqlite 打包 xe,C++ Builder XE10快速开发关于sqlite数据库APP应用发布小结

热门文章

  1. 2022 年 MathorCup 高校数学建模挑战赛——大数据竞赛(北京移动用户体验影响因素研究全套代码)
  2. 路面附着系数对轮胎侧偏特性的影响
  3. 《35岁失业再就业指南》
  4. Windows10家庭版VMWare15.5安装虚拟机启动蓝屏问题
  5. Vue3格式化时间、相对当前时间(前)
  6. hid触摸屏调试记录 Linux3.5 for Android
  7. 小白在“风变编程”上的Python入门之旅
  8. Excel中做图表,但周围的空白很多,如何将周围的空白剪切掉
  9. 四元数——为何使用四元数
  10. 【CQOI2009】叶子的染色