Spring Boot 调用第三方支付接口(支付宝-沙箱)
各位大神,请轻喷!
一、准备工作
第一步准备工作:下载支付宝开放平台开发助手https://docs.open.alipay.com/291/105971#LDsXr(一路安装就行)
第二步准备工作:注册,用支付宝扫码注册沙箱,网址:https://openhome.alipay.com/platform/appDaily.htm?tab=info
下面就要开始干活!!!!!!!!!
因为已经扫码注册过了,所以就直接进去根据图示往下操作
开发者中心=》研发服务
进入沙箱,在这里配置你的沙箱了,配置沙箱需要我们同时进行下一步操作,打开刚刚安装的支付宝开放平台开发助手,记住不要关闭页面
打开支付宝开放平台开发助手,依次按照步骤操作,可以新建文档保存复制的应用私钥和秘钥。注意一定要选择PAKCS8和2048
打开刚刚进入的网页
会弹出如下弹框,把公钥粘贴到红字的地方:
到这里就要打开我们的项目了,准备接入
二、项目
pom.xml中加入依赖
<!--整合支付宝支付-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.1.0</version>
</dependency>
新建一个AlipayConfig
public class AlipayConfig {
// ↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "APPID";//例:在沙箱网页中 信息部分中的必看部分2016101200671308
// 商户私钥,您的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这类自定义参数,必须外网可以正常访问
/**
* 返回的时候此页面不会返回到用户页面,只会执行你写到控制器里的地址
*/
public static String notify_url = "你的服务器地址/项目名称/notifyUrl";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
/**
* 此页面是同步返回用户页面,也就是用户支付后看到的页面,上面的notify_url是异步返回商家操作,谢谢
* 要是看不懂就找度娘,或者多读几遍,或者去看支付宝第三方接口API,不看API直接拿去就用,遇坑不怪别人
*/
public static String return_url = "你的服务器地址/项目名称/returnUrl";
// 签名方式
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 = "D:/logs/";
// ↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
}
controller层代码
@Controller
@RequestMapping("pay")
public class PayController {
@Autowired
private OrderService orderService;
@Autowired
private RedisServer redisServer;
@RequestMapping("/toPay")
@ResponseBody
public String toPay(String[] orderIds) throws Exception{
Double sumMoney=0.0;
for (String orderId : orderIds) {
Order order=orderService.getOrder(orderId);
sumMoney+=order.getOrdMoney();
}
String uuid = UuIdutil.getUUID().toString();
byte[] serialize = SerializeUtil.serialize(orderIds);
redisServer.setCacheValueForTime(uuid,serialize,1000*60*60*30);
//获得初始化的AlipayClient
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);
try {
alipayRequest.setBizContent("{\"out_trade_no\":\""+ uuid +"\","
+ "\"total_amount\":\""+String.valueOf(sumMoney) +"\","
+ "\"subject\":\""+ "测试支付" +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//请求
String result;
result = alipayClient.pageExecute(alipayRequest).getBody();
//System.out.println("*********************\n返回结果为:"+result);
return result;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
@RequestMapping("returnUrl")
public String returnUrl(HttpServletRequest request, HttpServletResponse response){
Map<String, String[]> parameterMap = request.getParameterMap();
String[] out_trade_nos = parameterMap.get("out_trade_no");
String uuid = out_trade_nos[0];
orderService.updateOrderInfo(uuid);
return "redirect:/good/toPayFor";
}
@RequestMapping("notifyUrl")
public String notifyUrl(HttpServletRequest request, HttpServletResponse response){
Map<String, String[]> parameterMap = request.getParameterMap();
for (String s : parameterMap.keySet()) {
String[] strings = parameterMap.get(s);
for (int i = 0; i < strings.length; i++) {
System.out.println(s+":"+strings[i]);
}
}
return "redirect:/good/toPayFor";
}
再配上前台页面,我用的是Freemaker
<#if orderList?exists>
<#list orderList as order>
<tr id="product_id_1" align="center">
<#if order.ordStatus==1>
<td><input type="checkbox" value="${order.ordId}" name="orderIds" checked/></td>
<#else>
<td></td>
</#if>
<td><a href="javaScript:showOrderDetail(${order.ordId})">${order.ordId}</a></td>
<#assign orderDetailList =order.orderDetailList />
<td>
<#list orderDetailList as orderDetail>
${orderDetail.goodName}<br/>
</#list>
</td>
<td class="price" id="price_id_1">
<span>${order.ordMoney}</span>
</td>
<#if order.ordPayType==1><td>微信</td>
<#elseif order.ordPayType==2><td>支付宝</td>
<#elseif order.ordPayType==3><td>京东支付</td>
<#elseif order.ordPayType==4><td>银联</td>
</#if>
<td>
${order.ordAdd}
</td>
<td>
<#if order.ordStatus==1>未支付
<#else>
已支付
</#if>
</td>
</tr>
</#list>
</#if>
</table>
<div class="button"><input type="submit" value="" /></div>
</form>
欢迎指导!!