支付宝平台文档中心
https://opendocs.alipay.com/open/270/105900
开发者中心
https://developers.alipay.com/platform/developerIndex.htm
沙箱账号地址
https://openhome.alipay.com/platform/appDaily.htm?tab=account
首先登陆,到开发者中心
下载生成公钥和私钥的工具
将获取的公钥设置
这样基本配置就已经完成,接下来我们可以看下文档 https://opendocs.alipay.com/open/270/105900
这里会详解介绍操作流程
点击api 列表,统一收单下单并支付页面接口 alipay.trade.page.pay
这就是我们待会调用请求必须设置的参数,接下来看代码
支付的配置类:
package com.lxq.httpclient.pay;
public class AlipayConfig {
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "20161021007302901";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCeSaKJQxolIySJevdA05kDgdfiVIJsqek55J12bxje3BHt5K3s6Hh5kyKClWhj59Q7gUif9sD+MobOs6pc7jhpZw/VqHP4LIJMVQ+gmWfgiD7ClJ3086jfRLIu+mxXlT49t5SEbTknbVAhcXPGNwJEsCHgMFSOiVBywRuRn5RMOP5bXSxZAMcYKn05ywWy7fgLP8kdk/yNuyN/giVm7x6H7w1GSqnsXv/o5jboKPrjjM0B+dc2cFb5oxlgT05Gv7zx3PqhWwlyqC/dg7eFNEq3smtaizECGD1rNoiFEqd1PMU/oNZgyZ9AZTpOgQxnt9dEscXODCpLkkNXJ0wyf6rNAgMBAAECggEAL2sdvwMUJQX3HxxwT8JT94IBW3M3szfff5FmPqGfkLvavyqfk/Y8iScz0mzR3gQIR18+k3VHcZ9PVULriXVv/tt6Geah/znOOvHMga8TOGd4bbA59bS85U3eF0a8CCzUfYauflF+KrqLo8kqBrpZ+pvNOi0gV6b5K7d/+8sTkRWTDxlAut9BnEmwfYlfuMhPGS2V7wxnkQtjXNudZKTNNaAor0melvXMUd2C8JNQOgFmzk4YDjgORatNrq7u0YF4RPdDOGrw9saMwFEVb4ernrDXOHQKJhHOtW0YlYBQn54G/ohNh41rZMCYYo+3vYQhMu0DqvURIpsh4tbMyA3ZvQKBgQDzOyy+y+WEKi71f+K1ALx7Yxc20Kg/tcBQm0vs8Yqa3aCfXFCAJnoV/lfHgcGS/gCegkSjNQCb3rnqNXikc4k/Z1nnrcO1RrKFPZecKobwRH21xOkzwnFAgsAETj4Cqce1plqgXmwsq+SZDZI6L8Mx0T9KJJERI11jSGDxXdppWwKBgQCmmOO/CC8xM8Bzv0FevME1E/VQCifGhqeJYsjHVurVcSaDGNLF7HxBxCUX6x1EYvbRunAhIjqQOPjQUeIUSPQmRs4gKhswoV8fCoHnvJ0eEtBIMbj045h6ZRuenGUT/poSSmH/MawTOL7JS5JUZkyFiwulytNizp+OXfdmhAdM9wKBgQCDXvGy96O2d6Y3WORUyNoEdqfCJn7JMlx17PrcNjWboZqwmAauwJluKZq1mgK4ZtJkyo1R7T2v8mNN+aV4hSKbCTJI7NRoo4+mYXbylRGe0g9nzrv6Bcpvgm89pBjgDV1dYkVOmtEoa4sjk23oWYW+8XqSjB+CNyyohB5AH2XpQwKBgFGlxqBeK3rKqTxQ9IGwsmQIBwcWIw5J+hv7/PitIWRAEybW6J212+QDdEZ3pR1Z/yskW0Xx14/NTCwUpV9ZrcaAlw7uc+rue4bkCGyBZONTRx7Kt6HVVWpO2S1v6p3U/r+OEt8WAgZdnitbTTjt9fzQ+4FimRzotQv6A4ELneRbAoGBAKGJOxzgv3fnTdg4qNLTXB+UkfQOz4EtB1SSnl3OjS0felz7SpHpvCnpP9cQolcKUhpkWE2JocOxbo+V5bRBQrSu9z6z9/AJ6rBNFzrGcA3X3hxG+8+tErd17ArLOuq4utBezWDLTM3LnuJd5Vp9uhQR54lK6M4RfufWEdfYrg7R";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnkmiiUMaJSMkiXr3QNOZA4HX4lSCbKnpOeSddm8Y3twR7eSt7Oh4eZMigpVoY+fUO4FIn/bA/jKGzrOqXO44aWcP1ahz+CyCTFUPoJln4Ig+wpSd9POo30SyLvpsV5U+PbeUhG05J21QIXFzxjcCRLAh4DBUjolQcsEbkZ+UTDj+W10sWQDHGCp9OcsFsu34Cz/JHZP8jbsjf4IlZu8eh+8NRkqp7F7/6OY26Cj644zNAfnXNnBW+aMZYE9ORr+88dz6oVsJcqgv3YO3hTRKt7JrWosxAhg9azaIhRKndTzFP6DWYMmfQGU6ToEMZ7fXRLHFzgwqS5JDVydMMn+qzQIDAQAB";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://localhost:8761/dgwl/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://localhost:8761/dgwl/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
// 签名方式
public static String sign_type = "RSA2";
// 字符编码格式
public static String charset = "utf-8";
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
}
package com.lxq.httpclient.controller;
import com.alibaba.fastjson.JSON;
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 org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
import static com.lxq.httpclient.pay.AlipayConfig.*;
/**
* @Author Lxq
* @Date 2020/4/3 0:31
* @Version 1.0
*/
@RestController
public class PayController {
@GetMapping("pay")
private String alipayPay() throws AlipayApiException {
Map<Object,Object> vo = new HashMap<>();
//这里模拟了一个订单的id
vo.put("out_trade_no",UUID.randomUUID().toString().replace("-", ""));
vo.put("product_code","FAST_INSTANT_TRADE_PAY");
vo.put("total_amount",99);
vo.put("subject","Test my demo");
String json = JSON.toJSONString(vo);
AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, app_id,
merchant_private_key, "json", charset, alipay_public_key, sign_type);
// 设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(return_url);
alipayRequest.setNotifyUrl(notify_url);
alipayRequest.setBizContent(json);
String result = null;
try {
result = alipayClient.pageExecute(alipayRequest).getBody();
} catch (Exception e) {
System.out.println(result);
}
return result;
}
/**
* @Description: 支付宝回调接口
* @param out_trade_no 商户订单号
* @param trade_no 支付宝交易凭证号
* @param trade_status 交易状态
* @return String
* @throws AlipayApiException
*/
@PostMapping("notify")
private String alipayNotify(HttpServletRequest request, String out_trade_no, String trade_no, String trade_status)
throws AlipayApiException {
Map<String, String> map = new HashMap<String, String>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
map.put(name, valueStr);
}
boolean signVerified = false;
try {
signVerified = AlipaySignature.rsaCheckV1(map, alipay_public_key, charset, sign_type);
} catch (com.alipay.api.AlipayApiException e) {
// 验签发生异常,则直接返回失败
return ("--failed--");
}
if (signVerified) {
//处理你的业务逻辑,更细订单状态等
return ("--success--");
} else {
return ("--failed--");
}
}
/**
* @Description: 支付宝回调接口
* @param out_trade_no 商户订单号
* @param trade_no 支付宝交易凭证号
* @return String
* @throws AlipayApiException
*/
@GetMapping("return")
private String alipayReturn(Map<String, String> params, HttpServletRequest request, String out_trade_no, String trade_no, String total_amount)
throws AlipayApiException {
Map<String, String> map = new HashMap<String, String>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
System.out.println(valueStr);
}
map.put(name, valueStr);
}
boolean signVerified = false;
try {
signVerified = AlipaySignature.rsaCheckV1(map, alipay_public_key, charset, sign_type);
} catch (AlipayApiException e) {
// 验签发生异常,则直接返回失败
return ("--fail--");
}
if (signVerified) {
return ("--success--");
} else {
return ("--fail--");
}
}
}