SpringBoot项目整合支付宝进行支付
在盈利性网站应用中,我们经常要用到支付,支付宝和微信作为日常使用量较多的支付方式,无疑是大多数人的选择,今天我们选择支付宝为例子来讲解一下怎么在SpringBoot中进行整合。
先看一下整个项目的目录和整合后的效果:
整个项目目录结构:

项目整合效果:


下面详细来完成此工程:
1.登录支付宝进行申请:


图中沙箱中的APPID已经存在,支付宝沙箱网关已经存在,这两个在后面的后台应用中需要用到。自己需要填的为RSA2(SHA256)秘钥。这个可以通过支付宝的秘钥生成工具进行生成,详细的生成过程可以点击下图中的红色标出按钮,然后点击生成方法,根据提示进行操作。

然后将生成的公钥粘贴到此处。这里我已经配好了公钥如下图:

2.配好了环境我们开始进行SpringBoot和支付接口的整合
(1)新建SpringBoot工程
这里用的是Idea。直接在idea里面通过springboot应用的引导进行创建。
(2)引入支付宝jar包
可以在https://docs.open.alipay.com/54/下载所需的jar包。如下图我们选择java版本的。

(3) 解压后将jar包引入工程
引入工程的方法有很多,这里提供一种:直接点击idea中如下图标。

然后出现如下图界面。选择Modules,找到右图中的Dependeccies,然后点击下图中红色标出的“+”号,选择第一个定位到解压的jar包,然后将所有jar包引用。

(3)进行pom文件配置
我们采用SpringBoot默认的thymeleaf末班引擎,所以在pom中加入以下依赖。
org.springframework.boot
spring-boot-starter-thymeleaf
(4)接下来新建AlipayConfig类,主要是支付宝的配置类。
该类也可以直接从官方文档里将该类复制过来。官方文档下载地址为:https://docs.open.alipay.com/270/
package com.lzh.zfbpaydemo.paycommon;
import java.io.FileWriter;
import java.io.IOException;
/* *
*类名:AlipayConfig
*功能:基础配置类
*详细:设置帐户有关信息及返回路径
*修改日期:2017-04-05
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "对应沙箱中的APPID";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "你利用支付宝秘钥工具生成的私钥";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "你利用支付宝秘钥工具生成的公钥";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问,假设这里的公网IP和端口为:49.269.31.237:8081
public static String notify_url = " http://49.269.31.237:8081 /pay/synnotify";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问,假设这里的公网IP和端口为:49.269.31.237:8081
public static String return_url = "http://49.269.31.237:8081/pay/return_notify";
// 签名方式
public static String sign_type = "RSA2";
// 字符编码格式
public static String charset = "utf-8";
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
// 支付宝网关
public static String log_path = "C:\\";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
/
* 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
* @param sWord 要写入日志里的文本内容
*/
public static void logResult(String sWord) {
FileWriter writer = null;
try {
writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
writer.write(sWord);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(5)新建PayService类,该类主要用来调用支付宝接口进行实际的支付。
package com.lzh.zfbpaydemo.paycommon; import com.alipay.api.AlipayApiException; 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.alipay.api.response.AlipayTradePagePayResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.*; @Controller public class PayService { @RequestMapping("/order/test") public String test(){ return "SynNotify"; } //支付宝支付确认付款跳转页面 @RequestMapping("/order/confrim") public void oderConfirm(HttpServletRequest request, HttpServletResponse response) { //虚拟一个订单,将其信息定义如下 String title = "支付订单"; String total = "1200"; String message = "备注"; //生成订单号 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String orderSn = simpleDateFormat.format(Calendar.getInstance().getTime()); Map
map=new LinkedHashMap<>(); //像支付宝发送请求 //初始化AlipClient AlipayClient 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 = orderSn; //付款金额,必填 String total_amount = total; //订单名称,必填 String subject = title; //商品描述,可空 String body = message; alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明 //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," // + "\"total_amount\":\""+ total_amount +"\"," // + "\"subject\":\""+ subject +"\"," // + "\"body\":\""+ body +"\"," // + "\"timeout_express\":\"10m\"," // + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节 AlipayTradePagePayResponse alipayResponse = null; try { alipayResponse=alipayClient.pageExecute(alipayRequest); response.setContentType("text/html;charset=" + AlipayConfig.charset); response.getWriter().write(alipayResponse.getBody());//直接将完整的表单html输出到页面 } catch (AlipayApiException e) { e.printStackTrace(); } catch (Exception e){ System.out.println("error"); e.printStackTrace(); } finally { } } //支付宝异步通知 @RequestMapping("pay/synnotify") public String synNotify(HttpServletRequest request) throws AlipayApiException, UnsupportedEncodingException { Map
params = new HashMap
(); Map
requestParams = request.getParameterMap(); for (Iterator
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"); if (trade_status.equals("TRADE_FINISHED")) { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 } else if (trade_status.equals("TRADE_SUCCESS")) { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //付款完成后,支付宝系统发送该交易状态通知 } System.out.println("success"); } else {//验证失败 System.out.println("fail"); //调试用,写文本函数记录程序运行情况是否正常 //String sWord = AlipaySignature.getSignCheckContentV1(params); //AlipayConfig.logResult(sWord); } return "SynNotify"; } //支付宝同步通知 @RequestMapping("pay/return_notify") public String returnNotify(){ return "return_notify"; } }
(6)建立return_notify.html同步通知页面、SynNotify.html异步通知页面
return_notify.html内容如下:
Title
支付成功!
SynNotify.html页面内容如下:
Title
支付宝异步通知!
(7)然后启动应用,在浏览器输入localhost:8081\order\confrim就可以看到如下的支付宝支付页面:

(8)然后下载支付宝沙箱版app,在开发者中心下图所示,将其安装在手机。

(9)登录沙箱账号,沙箱账号可在自己的支付宝官网沙箱应用中查看,如下图,登录后就可以进行支付测试。

(10)支付后,我们看不到同步通知异步通知页面,因为支付宝同步异步通知需要公网能进行访问,下面我们打包我们的应用将其部署在服务器上进行测试。
在idea中,自己导入的jar包,用mvn进行打包的过程中会提示找不到支付宝的配置类。我们采用如下方式进行。在工程中新建一个名为jar的文件夹。将支付宝jar包复制到该文件夹。如下图

然后在pom文件中进行配置加入下面的代码。其中groupid、artifactId,version可以便随填写。
com
pay-sdk
4.8.0
system
${project.basedir}/jar/alipay-sdk-java-4.8.0.jar
com
bcprov-jdk15on
1.62
system
${project.basedir}/jar/bcprov-jdk15on-1.62.jar
com
log
1.1.1
system
${project.basedir}/jar/commons-logging-1.1.1.jar
com
json
1.2.50
system
${project.basedir}/jar/fastjson-1.2.50.jar
org.springframework.boot
spring-boot-maven-plugin
repackage
true
然后找到右边maven,如下图,先点击:clean后点击package进行打包,这里打包为jar文件。

(11)将其部署到服务器进行测试。最后支付后会出现如下图所示,至此,springboot整合支付宝接口完成。




至此SpringBoot整合支付宝项目完成,测试环境已经搭好。。。。。。。。。。。。。。。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223811.html原文链接:https://javaforall.net
