下载电脑网站的官方demo:
建议:新手第一次接入支付的还是下载看看,了解下,readme.txt好好看下,包括以后看第三方的此文件最好先浏览下,要不容易踩坑
下面会有专门sdk接入指南
下载:docs.open.alipay.com/270/106291/
阿里源码主要Demo
package com.alipay.config;
/* *
*类名:AlipayConfig
*功能:基础配置类
*详细:设置帐户有关信息及返回路径
*修改日期:2017-04-05
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "2016102400748331";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIgHnOn7LLILlKETd6BFRJ0GqgS2Y3mn1wMQmyh9zEyWlz5p1zrahRahbXAfCfSqshSNfqOmAQzSHRVjCqjsAw1jyqrXaPdKBmr90DIpIxmIyKXv4GGAkPyJ/6FTFY99uhpiq0qadD/uSzQsefWo0aTvP/65zi3eof7TcZ32oWpwIDAQAB\n";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://工程公网访问地址/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.alipay.com/gateway.do";
// 支付宝网关
public static String log_path = "C:\\";
}
下面正式注册蚂蚁开发者账号
注册地址:open.alipay.com
选择如下
设置appid 以及ras密钥
ras在支付宝支付的应用(就是非对称假冒,公钥用来生成支付宝密钥【传输数据】,然后私钥在你程序中用来解密数据)
设置密钥
然后下载密钥生成工具如下
第三方sdk
<dependency>
<groupId>net.guerlab</groupId>
<artifactId>sdk-alipay-starter</artifactId>
<version>2.1.0</version>
</dependency>
然后将生成的公钥到网站上面粘贴,获取支付宝公钥,将支付宝公钥替换程序中的公钥,将你生成的私钥替换代码中的私钥
示例
spring:
mvc:
view:
# 页面默认前缀目录
prefix: /WEB-INF/jsp/
# 响应页面默认后缀
suffix: .jsp
server:
port: 9999
appid: wx60c1c374fd1329a2
secret: b6e4ebc42a1fa92d1ea7ea440e52d648
redirectUri: http://moran1012.natapp1.cc/callback
### 生成微信授权
authorizedUrl: https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
###获取code后,请求以下链接获取access_token
access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
###拉取用户信息(需scope为 snsapi_userinfo)
userinfo: https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
alipay:
#默认false,为true表示使用沙箱环境
dev: true
#签名算法 RSA2 RSA
sign-type: RSA2
#应用ID
app-id: 2012101200736715
#应用私钥
private-key: MIIEuwIBADANBgkqhkiG9w0BAQEFAASCBKUwggShAgEAAoIBAQDOP2FcM6sWiapQQqSBE4Y3OvXb6r0WVhmuZN9N7LdrQRV516Kxg4OL7goMei7i1gzY3becqhiVYdRG+q0WhZ3K0i8EecpUeTUG7avxMYFsc9CoQNd/IxRXy+qRrg6Y7QAvuwhSakse+k/3+VUVto/i3wIY+Satph//iIzawKqMRZxZbhX7SjvK4Iaajitvqd3NcWhmh179XxkBA3ySQoWXLNO2FFs8sdmpRVV5MweZBJVaGwW2OQpAMs4tkpdrWf2m8iFUanIRW/6GeApt58tlPgkkt3TyP9rAQPLY+fKxScbNaPbvB9E8ZGkKoaA9/TJZPwlKxtSF1x/k1pEAp5m1AgMBAAECgf8t6+7BmL9/RSemty/pjW9U3MvhK2Lulj0hl1QhBZPRTax6dIjE/YNMpLOYE5xc5Uv2/Wbkevr+R8n8A9SGLzny7tmJJZTnOhWUdVbTXTJz81WCIO3aYPUml0CjLx4Q7rQb7Ijt0LzpKNKgfeNz8jIXUZAl/1OdVl/JhZ3XFw7iLDbTACqTKCENTFz9XlJ80JsUCibDUJi2pqC4nZcHJOSxvPLVIOOFn7XdtuqdrwlWtAOk0m/Rbf1XVf6JPbS7dNgJk+n8c1TvRZz2wrid5m7ctuQyyxfdut0vZxBYgzZX10RXrXB1hZDHmyItZAUa0hmxUT/un9ufQ46r3QEd0w0CgYEA/Wp/m8eai6uyr+X7nHNg968EFF4phovTRd9W0XIRYqToylL3os9HIKE5U+/sekGEzX/70aqJxw9SiT/h5ADgejRL4piDWfJxu05tA/O3bboQBg1rPd1vkQOitaoyf9AO/Ge2ugjGGskkwosj9d5z5mz9GSpPS/ZyBpqOgghXN/8CgYEA0FnBm4wPVVwi/dU3VT8Jmj91R3IP4UyBTzcJlkVQ7ccCRbObuf9TOROcs7N7gUNVxksjVRnCF07aRYDYCN6EZkhVnwN+kzSDcO/3H2a6Ij+jfGtkfpMR0uhAz9OgbbJrJEZLlwFp3ilM2BAhADWaET2OxoTc2fUvjf1zksCgYBQuPflG3PzQcItncjEUUx2GV3nTwdTQH8QJtB07yzyiy1MJZmUVwqFLlYgkrB1USGIhFgmtXgl3I+iAKNoCY933ei+SW6t3Di2PYkkVSH85ePsyaF7l2nOe6X80DY92Hytkiv2nozcQ25eOgw+aZnpsJX+yidwPxSbXeg/K4D86QKBgHO+GO7HLNF3oLywENAbd8Mnk4hAFhBLxt3xrjK7iQy+bEW6VD1MWLgxa/DsOSUC+ghxP0yMRaVbGahYviqXKqgDcQUnUhUAyzaMLHiXEON1J3QcfoTuCEU67dsBaY37QiqPF5P0+y8k0cNKI0PaKZzrNjCwdrU4dCu9N5MAVV3nAoGBAKcTefy22LXuduw0HeTxR1JGwn9eg/whPVxSPPfFxNTGxKicoP4eKy4bQYSscI9cgS5GTFXqEHEaLeEKuLEV4/auZ/7b5+o+BfjsQnyaxV8A8fgQNAUv5Q7rU/zrgQM8E4MXP99bQNOJJgAjm7+dpRZ/GJL9SiAHkJL5h2McSNCh
#支付宝公钥
alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhWdnts9UIBLSwIin1IToaCXc5xV2vX6BhOFms6K7pbzNVFCQ3tgnqrPbpjyI6ZUTwPTbhu3u+aafbC1hOQAsciBALxTP/pDe+AOPDoUo5Yj9D+Io+Q6d/sEDtsJQuaPpWMET0qM4Nngn1iroJYef4CbenjFMZ4IYzciBZlNgVzSgf6ZOvF9C7tAwpaURFs2r2e8HxoyUrv/T7oVU5Ws/a70FpQB4JuirKIeTLEE4fia9IjMOOmicXcFlpR0ht/m8ggAdr5o+hl+vU1EKcTUJKCogRdlt29DZQ2RLutr0tIaFAJ2kzoocLtQW7AyI8TnHZFDFqJiBap1GsQgltMGWBwIDAQAB
支付代码
/**
* @ClassName AliPayController
* @Description TODO
* @Author moran
* @Date 2020/4/21 16:04
**/
@Slf4j
@RestController
@RequestMapping("/open/api/pay")
public class AliPayController {
@Autowired
private AlipayClient client;
@Autowired
private AlipayProperties properties;
private static final String REDIRECT_WFWZS_URL = "http://moran1012.natapp1.cc/return_url.jsp";
@GetMapping("/submit_pay")
public void submitPay(HttpServletResponse response
) throws AlipayApiException, IOException {
JSONObject data = new JSONObject();
String orderNo = System.currentTimeMillis()+ "";
data.put("out_trade_no",orderNo ); // 商户订单号
data.put("total_amount", "0.01"); // 订单金额
data.put("subject", "测试支付宝下单"); // 订单标题
data.put("product_code", "FAST_INSTANT_TRADE_PAY"); // 产品码, PC支付 FAST_INSTANT_TRADE_PAY,
AlipayTradePagePayRequest requestAli = new AlipayTradePagePayRequest();
requestAli.setNotifyUrl("http://moran1012.natapp1.cc/open/api/pay/notify_ali"); // 异步通知地址
requestAli.setBizContent(data.toJSONString()); // 业务参数
String returnUrl = REDIRECT_WFWZS_URL + "?orderNo=" + orderNo;
requestAli.setReturnUrl(returnUrl);
String from = client.pageExecute(requestAli).getBody();
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(from);
}
/**
* 异步通知
*
*/
@PostMapping("/notify_ali")
public void notifyAli(HttpServletRequest request, HttpServletResponse response) throws Exception {
log.info("支付宝异步通知数据:{}", ServletUtil.getParamMap(request));
if (!AlipayUtils.rsaCheck(properties, request.getParameterMap())) {
// 这里处理验签失败
log.error("支付宝异步通知验签失败");
response.getWriter().write("fail");
response.getWriter().flush();
response.getWriter().close();
} else {
String out_trade_no = request.getParameter("out_trade_no");// 获取请求参数中的商户订单号
log.info("支付宝异步通知验签成功,订单号:{}", out_trade_no);
// 交易状态
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) {
// TRADE_FINISHED 退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
// TRADE_SUCCESS 付款完成后,支付宝系统发送该交易状态通知
// 判断该笔订单是否在商户网站中已经做过处理
// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
// 如果有做过处理,不执行商户的业务程序
}
response.getWriter().write("success");
response.getWriter().flush();
response.getWriter().close();
}
}
}
前端页面请求支付
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<body>
<button onclick="ww()">pay</button>
</body>
<script type="text/javascript">
function pay(){
$.ajax({
url: "../open/api/pay/submit_pay",
type: "get",
success: function(r) {
//将支付宝返回的数据渲染 div
$("body").append(r);
}
})
}
</script>