#本地
alipay:
#支付宝网关(固定)
url: https://openapi-sandbox.dl.alipaydev.com/gateway.do
#APPID 即创建应用后生成。
appId: 9021000131623507
privateKey: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDJfH3rSxt2pxnO9+EUHxDmY8qSySbBox651Eig95k+CxCQH97JeaOF6RVnmA4AWER1CuJxkeTLLSDtC/Ji7YVLXpGCwgTvPLznkYpp7fbJM9F2Sdmn9qNkjHTAI88pGK3TWsIU/YqJ5lLzNsprC/ZCpV0oVlnStn3sgj6CH41Z64CULr982UzxamJ9f2jGb5XzD7YNeMhNU9FKX4kzVmad8HHGqopQaeZeXXnM/AE9O0yp3ONcTlDIisBga2gyWXr8MvOO521KVbFJsbNMn6T4Rmzb3HYEtqero//tJwQLV+2ZjSkZqNseIp87NmELeIwMDDJLGH1cAkdmpRsvrmyVAgMBAAECggEBAIdb90wnfR/NSu1cYf2ekT/2MpVCRaM47t9w2gopzO19iXcJsiYwbcb8u8CIyn84zWTEFzStCsPkYYZezEvhvfbQZXku1xnR+CaqBA7+KxkoksOhAXRxoXtfUN/0LqwxRDYFdvWbD4NtFLUIThx0QNCtP1RmDpoct6Q4K75HbDLHbVsY4p3aEIISyD9t4DBJZ+KjpTkTR+0yo/CDu3QzQCwxeqEugNep4JdDu/KG0BqjZhlxbvQ7HXjg8OjNaS4hNgTqNh/w4hxGVUX/RSIONwxBtL8TmZQcVoY2zzUmTF/F2/+0AEud0ayQeSBVHFVm8iVxPeI2bHpez0q5rG+T4oECgYEA+hehSwMlLSesWs4/mOWtHXb5jTEcEU4q6VqwSj+NE4iHDef249bohV5S1Z34vvvJHrfCWU8o13cWzQnLzL0cOCRuO1vvuM7O/mBjKcZPQyumm7DbYU7wJ28yJb6a8umXyidktrgBOIQYDhWZxW7O95Ptlf3uUfWP4UH7tlpbg4kCgYEAzj7t5UigG89l6l3hdPM9jPOQtNiXaXmq6URScmwnWqtAvfqazI762oQlCy4LCPCOzkH5XwO3Axkhp1JCwAWoOTOiyrMrynRcMphvkYp7H6mj1bjUPF3TdqmKN+NkW1X5kEiwaaOCTHa5J4cqbkp5HPHJDG5aHJqAk6B1QSX7Aa0CgYEAn3YPrt+bhbYlLGUToe7YOdBRgBhPGC2qKM5dV4o77rd/vXspLc8qxVcGJBSstUGf1ElAz2cs2G2jiSr02l++LYH1Ez4klMawrvtQXyOGCIM9oUncJ6iIcexxoiVtcPNGiGwjyGl8xcdb+ycEvCFSMAQPWjLmETYs/mjvES996FkCgYAGkiqyK2YufKUamnMcbsN/QiNSH7RzP9UaKXsW+ism0F33r4xPCB8l5x/nA0iGuGNUXvW6+TtTdfGEizJlO8joSaTeIGc8xAhL9F9Zm7fggl8d6A2a/sJF/ZDRxwTjhBG3bxlvxC3akc3EXKIVcXn6Whm1s65bSvDdwzb5JGSi4QKBgEgvHQsKICeOO253RYQ2LBogrwPk2OyWxD9RTALnf5ZB3vN7l+RfR0R/3qAQfxvUSb0TKwV4PFR9Ep8jpaEgTZqx9zF8ADULm5KEE7wCYLk0O9v7nUs0+z5UkBGk7YjxoUBrZzIGXs68AbmgCxHPDgWg3TbEzfqsplPhz2b8V7Vq
publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyXx960sbdqcZzvfhFB8Q5mPKkskmwaMeudRIoPeZPgsQkB/eyXmjhekVZ5gOAFhEdQricZHkyy0g7QvyYu2FS16RgsIE7zy855GKae32yTPRdknZp/ajZIx0wCPPKRit01rCFP2KieZS8zbKawv2QqVdKFZZ0rZ97II+gh+NWeuAlC6/fNlM8WpifX9oxm+V8w+2DXjITVPRSl+JM1ZmnfBxxqqKUGnmXl15zPwBPTtMqdzjXE5QyIrAYGtoMll6/DLzjudtSlWxSbGzTJ+k+EZs29x2BLanq6P/7ScEC1ftmY0pGajbHiKfOzZhC3iMDAwySxh9XAJHZqUbL65slQIDAQAB
merchantPrivateKey: |
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDFQbmttxyHBuiR60wI4i3NkX8b1X3joNds/7/7BMMbYJ+yQZw/cKAmv2RK0b31tc2CFUI5ZRtPQDSmiOBogWAHg6ItUD/JwPHv9c8m5Ss0RJVwVgaRALnma3kZOWDHqIgUNvIqhfUO+mUWMFEQPNCv692So9diFBiLbA36hd1Il/xE7ORqlm/aTQ7RQvr+ReorzW5GZUcd1Fe1mCxJvgrFeckNGTxYEOMc4VuuzguT32iSXKw2xFljrKp4XaVfeZUWLTbPBNnI15VcgOEQSJmo+Kodlmy5M0s17Pg9AvRUU+iz7vq/5BTM2mde1yz402W85RveXHW8IBv30HGyK68dAgMBAAECggEAcSGf73ystNiGfGH56sJlyJeg0gLgv7OYuh/4KGxzxfjlvmOYzF24zGBKkgq3KvwJEIlGwQo23n4RdE3efrFstQKO+fQjkX/CgoB1PXaED+ch2hrMi09iTz/mZUweMIR8/zMAMtk/UkbTwSUW6PwoKC1bl+W1+r9R0Gy5m6w43I+ioSTkdTnR93RkQKjeHxgpqeip5bPm9WQsfXofxLedXcjmtd/z9cqUf26hw9uj5Pghv7r2qgHPKUGjCaR9PK/OZBUPU0Q64l2cHASvP62YIYqkPAl7eXR77x/lSThmnReeT7zhTwGK5k6VF3cn7qU9IQoawt3Kje7OdI+0hUSYVQKBgQD/875VRTxOYplQKbPdH9pCJD7NC3RJMzFNiaqBkSGk0S0mHMwWjZLn1KzUrUSatHpbYLYx8UDUSxytwctQXyZ/wzjfXW/XFqDT7ZWpBpH4EnhFzpRhYfE6SlpwXHR50KhWRMYQC3D7kON/twRLjKU1ibOoD4bhNJoyaoEamMKKJwKBgQDFSyvPbs/qoaXWxX3yrm+g9Zg8BK46LVW0AnylTP8kQQPfZLjGJ5DTRKRoefNBlmOOGOpKbOeSBAWyhUAjq0GsmBhlQP8TOpdfDYga+TfzTcGYAVo4mXd+o5wlGTDnvKC9b4M/vwHo0RsDbhDgjVkh3/S8IDvnXXFvq0bRvGMbGwKBgQDrVs+kEeQQYsJ7Hc0evaHufOstl6GViLeFhtY7Chn4NMkhqQrSldwEw90iNCrHYLi8emEr7JriWCoHbhAmV0bL5NHPN1eVWl4IXwTkBIGEql7iOL7gB7FJGoKrm6cRNpUBtXyz1gFNnfxAOyR83tYtMu740UYAnmBFiP4qWVlOswKBgHl4ZMrcMQsG53IqOfdWysfRLh+Vyidrjh68gT3NADG0DcxW2SS3a4WH96mTm9+/1h/A209jadgOvetB+1F6uX6oTizZLbMLGfOeAzSISJh2QUFzY7cBVf8UgKier+udyWGY7Lgsw+IyDG26MI3wuPYQS0AgoIE8mQDl9T5gvKwNAoGAOn7Tu+20PyOvs7CiZASZ4V4PjaKtD6hSdWCN5ax2sRrrcoon/4o2IGeoY1Sjqp2fsdYQwV1fKgos5XT5m0E71BzVAtGHCXTNhLzANM7c+A8XvQ85cKMRUZzIov8k4yAf5PhF8r5AXVttSB965WHZib7n36rt3QEbdJfV6EK9cd0=
alipayPublicKey: |
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApWuuK9T4krVL6jBSoCMqmdBvJedVy7Y/F8789AL28IcR/+tf5S020yGd9gMG4o8VFSla8JJ2xYa+Zmef2oNH4fipx4O2cgxptrlYabQodx8wR9tb0qG/JE+MlTJrgd14V58TRcO+EUwgkSHvt15szX0juzrlJSPDNRvkhDSDAAY5iAgmYgAKiPvI5uW0VGlVRkFA1gb5C9ue8EE58eelYvyljf+fw2NIavM3+1Y20bPgtnKwh2nEB1txcuCfRYCGBe8AmJEOdtbkabVCUX4OtbryGnoIjMjqdxxAlNzBTqbR9GDUgGeP/51jELRuLCF5c4YrpHZB8TMJ4OXEdESZiwIDAQAB
format: json
#编码集,支持 GBK/UTF-8。
charset: UTF-8
#生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐使用 RSA2。
signType: RSA2
notifyUrl: http://vjazuv.natappfree.cc/notify
returnUrl: http://ng8mqa.natappfree.cc/callback
package com.chart.web.controller.aliPay;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.domain.ExtUserInfo;
import com.alipay.api.domain.InvoiceKeyInfo;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.domain.InvoiceInfo;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.domain.ExtendParams;
import com.alipay.api.domain.GoodsDetail;
import com.alipay.api.domain.SubMerchant;
import com.alipay.api.FileItem;
import java.util.Base64;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.*;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.chart.common.core.domain.AjaxResult;
import com.chart.common.utils.QRCodeUtils;
import com.chart.web.controller.chart.sta.JsonsUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
@Component
public class AlipayUtil {
@Value("${alipay.appid}")
private String appid;
@Value("${alipay.url}")
private String url;
@Value("${alipay.privateKey}")
private String privateKey;
@Value("${alipay.publicKey}")
private String publicKey;
@Value("${alipay.alipayPublicKey}")
private String alipayPublicKey;
@Value("${alipay.merchantPrivateKey}")
private String merchantPrivateKey;
@Value("${alipay.charset}")
private String charset;
@Value("${alipay.signType}")
private String signType;
@Value("${alipay.format}")
private String format;
@Value("${alipay.notifyUrl}")
private String notifyUrl;
@Value("${alipay.returnUrl}")
private String returnUrl;
public void pay(String id, String price, String title, HttpServletResponse response) throws IOException {
AlipayClient alipayClient = new DefaultAlipayClient(
url, appid, privateKey, "json", "GBK", alipayPublicKey, "RSA2"
);
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", id);
bizContent.put("total_amount", price);
bizContent.put("subject", title);
bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
request.setBizContent(bizContent.toString());
try {
AlipayTradePrecreateResponse alipayResponse = alipayClient.execute(request);
if (alipayResponse.isSuccess()) {
System.out.println("调用成功");
String qrCodeUrl = alipayResponse.getQrCode();
System.out.println("二维码路径: " + qrCodeUrl);
// 设置响应内容类型为图片
response.setContentType("image/png");
// 获取输出流并生成二维码
ServletOutputStream outputStream = response.getOutputStream();
QRCodeUtils.encode(qrCodeUrl, outputStream);
outputStream.flush();
} else {
System.out.println("调用失败");
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "调用失败");
}
} catch (AlipayApiException e) {
e.printStackTrace();
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "调用异常");
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private String convertCentsToYuan(String priceInCents) {
// 将分转换为元,并保留两位小数
BigDecimal priceInYuan = new BigDecimal(priceInCents).divide(new BigDecimal(100));
return priceInYuan.setScale(2, RoundingMode.HALF_UP).toString();
}
/**
* 支付宝当面付支付接口
*
* @param id
* @param priceInCents
* @param title
* @return
* @throws AlipayApiException
*/
public String aliPayText(String id, String priceInCents, String title) throws AlipayApiException {
// 转换金额:将分转换为元
String price = convertCentsToYuan(priceInCents);
AlipayClient alipayClient = new DefaultAlipayClient(
url, appid, privateKey, "json", charset, alipayPublicKey, signType
);
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
// 设置回调地址
request.setNotifyUrl(notifyUrl);
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", id);
bizContent.put("total_amount", price);
bizContent.put("subject", title);
bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
request.setBizContent(bizContent.toString());
AlipayTradePrecreateResponse alipayResponse = alipayClient.execute(request);
if (alipayResponse.isSuccess()) {
System.out.println("调用成功");
return alipayResponse.getQrCode();
} else {
System.out.println("调用失败");
throw new AlipayApiException("调用失败,错误信息:" + alipayResponse.getSubMsg());
}
}
/**
* 支付宝自定义支付
* @param id
* @param priceInCents
* @param title
* @return
* @throws AlipayApiException
*/
public String customPayment(String id, String priceInCents, String title) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(
url, appid, privateKey, "json", charset, alipayPublicKey, signType
);
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
// 设置回调地址
request.setNotifyUrl(notifyUrl);
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", id);
bizContent.put("total_amount", priceInCents);
bizContent.put("subject", title);
bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
request.setBizContent(bizContent.toString());
AlipayTradePrecreateResponse alipayResponse = alipayClient.execute(request);
if (alipayResponse.isSuccess()) {
System.out.println("调用成功");
return alipayResponse.getQrCode();
} else {
System.out.println("调用失败");
throw new AlipayApiException("调用失败,错误信息:" + alipayResponse.getSubMsg());
}
}
public String aliPay(String id, String priceInCents, String title) throws AlipayApiException {
// 转换金额:将分转换为元
String price = convertCentsToYuan(priceInCents);
AlipayClient alipayClient = new DefaultAlipayClient(
url, appid, privateKey, "json", "GBK", alipayPublicKey, "RSA2"
);
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setNotifyUrl(notifyUrl);
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", id);
bizContent.put("total_amount", price);
bizContent.put("subject", title);
bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
request.setBizContent(bizContent.toString());
AlipayTradePrecreateResponse alipayResponse = alipayClient.execute(request);
if (alipayResponse.isSuccess()) {
System.out.println("调用成功");
return alipayResponse.getQrCode();
} else {
System.out.println("调用失败");
throw new AlipayApiException("调用失败,错误信息:" + alipayResponse.getSubMsg());
}
}
public String pay(String id, String price, String title) {
AlipayClient alipayClient = new DefaultAlipayClient(url, appid, privateKey, "json", "GBK", alipayPublicKey, "RSA2");
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
// 设置支付成功后的回调地址,改地址必须外网可以访问到才行,所以调试该步骤必须要在外网环境,否则会出现支付成功但是却不能回调
// request.setNotifyUrl("");
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", id);
bizContent.put("total_amount", price);
bizContent.put("subject", title);
// bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
request.setBizContent(bizContent.toString());
AlipayTradePrecreateResponse response;
try {
response = alipayClient.execute(request);
if (response.isSuccess()) {
System.out.println("调用成功");
String qr_code = response.getQrCode();
// 需要修改为运行机器上的路径
String filePath = String.format("d:/qr-%s.png",
response.getOutTradeNo());
System.out.println("filePath:" + filePath);
return qr_code;
} else {
System.out.println("调用失败");
return "调用失败";
}
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "调用异常";
}
}
public String query(String id) {
AlipayClient alipayClient = new DefaultAlipayClient(url, appid, privateKey, "json", "UTf-8", publicKey, "RSA2");
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", id);
request.setBizContent(bizContent.toString());
AlipayTradeQueryResponse response = null;
String body = null;
try {
response = alipayClient.execute(request);
body = response.getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
return body;
}
//回调函数
public String code(String id, String price, String title) {
AlipayClient alipayClient = new DefaultAlipayClient(url, appid, privateKey, "json", "UTf-8", publicKey, "RSA2");
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setNotifyUrl(notifyUrl);
request.setReturnUrl(returnUrl);
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", id);
bizContent.put("total_amount", price);
bizContent.put("subject", title);
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
request.setBizContent(bizContent.toString());
AlipayTradePagePayResponse response = null;
String form = null;
try {
response = alipayClient.pageExecute(request);
form = response.getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
return form;
}
/**
* 支付宝当面付查询订单状态
*
* @param tradeNo
* @return
* @throws AlipayApiException
*/
public AjaxResult queryOrder(String outTradeNo) throws AlipayApiException {
// 初始化SDK
AlipayClient alipayClient = new DefaultAlipayClient(url, appid, privateKey, "json", "UTf-8", alipayPublicKey, "RSA2");
// 构造请求参数以调用接口
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
// 设置订单支付时传入的商户订单号
model.setOutTradeNo(outTradeNo);
// 设置支付宝交易号
// model.setTradeNo(outTradeNo);
// 设置查询选项
List<String> queryOptions = new ArrayList<String>();
queryOptions.add("trade_settle_info");
model.setQueryOptions(queryOptions);
request.setBizModel(model);
// 第三方代调用模式下请设置app_auth_token
// request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");
AlipayTradeQueryResponse response = alipayClient.execute(request);
System.out.println(response.getBody());
if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
// sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
// String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
// System.out.println(diagnosisUrl);
}
return AjaxResult.success(response);
}
/**
* 支付宝当面付查询订单状态
*
* @param tradeNo
* @return
* @throws AlipayApiException
*/
public String queryOrderTwo(String outTradeNo) throws AlipayApiException {
// 初始化SDK
AlipayClient alipayClient = new DefaultAlipayClient(url, appid, privateKey, "json", "UTf-8", alipayPublicKey, "RSA2");
// 构造请求参数以调用接口
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
// 设置订单支付时传入的商户订单号
model.setOutTradeNo(outTradeNo);
// 设置支付宝交易号
// model.setTradeNo(outTradeNo);
// 设置查询选项
List<String> queryOptions = new ArrayList<String>();
queryOptions.add("trade_settle_info");
model.setQueryOptions(queryOptions);
request.setBizModel(model);
// 第三方代调用模式下请设置app_auth_token
// request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");
AlipayTradeQueryResponse response = alipayClient.execute(request);
System.out.println(response.getBody());
if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
// sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
// String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
// System.out.println(diagnosisUrl);
}
return response.getBody() ;
}
//以上是当面付
//以下是网站支付
/**
* 电脑网站支付
*
* @param id
* @param price
* @param title
* @return
* @throws AlipayApiException
*/
public String computerWebsite(String id, String price, String title) throws AlipayApiException {
// 初始化SDK
AlipayClient alipayClient = new DefaultAlipayClient(url, appid, privateKey, "json", "UTf-8", alipayPublicKey, "RSA2");
// 构造请求参数以调用接口
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
// 设置回调地址
request.setNotifyUrl(notifyUrl);
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", id);
bizContent.put("total_amount", price);
bizContent.put("subject", title);
bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
request.setBizContent(bizContent.toString());
request.setBizContent(bizContent.toString());
// 如果需要返回GET请求,请使用
AlipayTradePagePayResponse response = alipayClient.pageExecute(request, "GET");
String pageRedirectionData = response.getBody();
return pageRedirectionData;
}
}
package com.chart.web.controller.aliPay;
import cn.hutool.core.util.XmlUtil;
import com.alipay.api.AlipayApiException;
import com.chart.common.core.domain.AjaxResult;
import com.chart.common.utils.QRCodeUtils;
import com.chart.web.controller.chart.sta.JsonsUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping
public class AlipayController {
private AlipayUtil alipayUtil;
@Autowired
public void setAlipayUtil(AlipayUtil alipayUtil) {
this.alipayUtil = alipayUtil;
}
/**
* 支付宝当面付支付接口
*
* @param response
* @param orderNum
* @return
*/
@GetMapping(value = "/order/alipay/text")
@ApiOperation("付费套餐:支付宝支付主接口")
public AjaxResult createAlipayQRCode(HttpServletResponse response, String orderNum) {
OutputStream sos = null;
try {
if (orderNum == null || orderNum.isEmpty()) {
return AjaxResult.error("订单号不能为空");
}
// 模拟订单信息
String orderDetails = "商品描述"; // 商品描述
Integer totalPrice = 1; // 总金额
String price = totalPrice.toString(); // 转换为字符串类型
// 调用支付宝支付接口获取二维码URL
String qrCodeUrl = alipayUtil.aliPayText(orderNum, price, orderDetails);
if (qrCodeUrl == null) {
return AjaxResult.error("获取二维码URL失败!");
}
// 设置响应内容类型为图片
response.setContentType("image/png");
// 获取输出流并生成二维码
sos = response.getOutputStream();
//生成二维码
QRCodeUtils.encode(qrCodeUrl, sos);
sos.flush();
// 返回成功,二维码已经写入响应
return AjaxResult.success();
} catch (IOException e) {
e.printStackTrace();
return AjaxResult.error("二维码生成失败!");
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("调用支付宝接口异常!");
} finally {
if (sos != null) {
try {
sos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@GetMapping("/return")
public String returnNotice(String out_trade_no, Model model) {
String query = alipayUtil.query(out_trade_no);
model.addAttribute("query", query);
return "query";
}
/**
* 支付宝当面付回调接口
*
* @param trade_no
* @param total_amount
* @param trade_status
*/
@PostMapping("/notify")
public void notifyUrl(String trade_no, String total_amount, String trade_status){
System.err.println("支付宝订单编号:" + trade_no + ", 订单金额: " + total_amount + ",订单状态:" + trade_status);
System.out.println("支付宝订单编号:" + trade_no + ", 订单金额: " + total_amount + ",订单状态:" + trade_status);
}
/**
* 支付宝当面付查询支付状态接口
*
* @param trade_no
* @return
* @throws AlipayApiException
*/
@GetMapping("queryOrder")
public AjaxResult queryOrder(String orderNum) throws AlipayApiException {
AjaxResult queryOrder = alipayUtil.queryOrder(orderNum);
return AjaxResult.success(queryOrder);
}
/**
* 支付宝当面付查询支付状态接口
*
* @param trade_no
* @return
* @throws AlipayApiException
*/
@GetMapping("queryOrderTwo")
public HashMap<Object, Object> queryOrderTwo(String orderNum) throws AlipayApiException, JsonProcessingException {
String queryOrder = alipayUtil.queryOrderTwo(orderNum);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(queryOrder);
HashMap<Object, Object> map = new HashMap<>();
map.put("code",200);
map.put("msg","操作成功");
map.put("data",jsonNode);
return map;
}
//以上是当面付
//以下是网站支付
/**
* 电脑网站支付
*
* @param response
* @param orderNum
* @return
*/
@GetMapping(value = "/order/computerWebsite")
@ApiOperation("付费套餐:支付宝支付主接口")
public AjaxResult computerWebsite(HttpServletResponse response, String orderNum) throws AlipayApiException {
if (orderNum == null || orderNum.isEmpty()) {
return AjaxResult.error("订单号不能为空");
}
// 模拟订单信息
String orderDetails = "商品描述"; // 商品描述
Integer totalPrice = 1; // 总金额
String price = totalPrice.toString(); // 转换为字符串类型
// 调用支付宝支付接口获取二维码URL
String pageRedirectionData = alipayUtil.computerWebsite(orderNum, price, orderDetails);
return AjaxResult.success(pageRedirectionData);
}
}
/**
* 支付宝自定义付款
*
* @param response
* @param orderNum
* @return
*/
@GetMapping(value = "/alipay/customPayment")
@ApiOperation("付费套餐:支付宝支付主接口")
public AjaxResult customPayment(HttpServletResponse response, String orderNum, String price, String orderDetails) {
OutputStream sos = null;
try {
if (orderNum == null || orderNum.isEmpty()) {
return AjaxResult.error("订单号不能为空");
}
// 调用支付宝支付接口获取二维码URL
String qrCodeUrl = alipayUtil.customPayment(orderNum, price, orderDetails);
if (qrCodeUrl == null) {
return AjaxResult.error("获取二维码URL失败!");
}
// 设置响应内容类型为图片
response.setContentType("image/png");
// 获取输出流并生成二维码
sos = response.getOutputStream();
//生成二维码
QRCodeUtils.encode(qrCodeUrl, sos);
sos.flush();
// 返回成功,二维码已经写入响应
return AjaxResult.success();
} catch (IOException e) {
e.printStackTrace();
return AjaxResult.error("二维码生成失败!");
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("调用支付宝接口异常!");
} finally {
if (sos != null) {
try {
sos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.chart.common.utils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.Hashtable;
import java.util.Random;
/**
* 生成主题颜色
*
* @author chart
*/
public class QRCodeUtils
{
private static final String CHARSET = "utf-8";
private static final String FORMAT_NAME = "JPG";
// 二维码尺寸
private static final int QRCODE_SIZE = 300;
// LOGO宽度
private static final int WIDTH = 60;
// LOGO高度
private static final int HEIGHT = 60;
private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,hints);
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
if (imgPath == null || "".equals(imgPath)) {
return image;
}
// 插入图片
insertImage(image, imgPath, needCompress);
return image;
}
/**
* 插入LOGO
*
* @param source
* 二维码图片
* @param imgPath
* LOGO图片地址
* @param needCompress
* 是否压缩
* @throws Exception
*/
private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {
File file = new File(imgPath);
if (!file.exists()) {
System.err.println("" + imgPath + " 该文件不存在!");
return;
}
Image src = ImageIO.read(new File(imgPath));
int width = src.getWidth(null);
int height = src.getHeight(null);
if (needCompress) { // 压缩LOGO
if (width > WIDTH) {
width = WIDTH;
}
if (height > HEIGHT) {
height = HEIGHT;
}
Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0, null); // 绘制缩小后的图
g.dispose();
src = image;
}
// 插入LOGO
Graphics2D graph = source.createGraphics();
int x = (QRCODE_SIZE - width) / 2;
int y = (QRCODE_SIZE - height) / 2;
graph.drawImage(src, x, y, width, height, null);
Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
graph.setStroke(new BasicStroke(3f));
graph.draw(shape);
graph.dispose();
}
/**
* 生成二维码(内嵌LOGO)
*
* @param content
* 内容
* @param imgPath
* LOGO地址
* @param destPath
* 存放目录
* @param needCompress
* 是否压缩LOGO
* @throws Exception
*/
public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {
BufferedImage image = createImage(content, imgPath, needCompress);
mkdirs(destPath);
String file = new Random().nextInt(99999999) + ".jpg";
ImageIO.write(image, FORMAT_NAME, new File(destPath + "/" + file));
}
/**
* 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
*
* @author lanyuan Email: mmm333zzz520@163.com
* @date 2013-12-11 上午10:16:36
* @param destPath
* 存放目录
*/
public static void mkdirs(String destPath) {
File file = new File(destPath);
// 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
}
}
/**
* 生成二维码(内嵌LOGO)
*
* @param content
* 内容
* @param imgPath
* LOGO地址
* @param destPath
* 存储地址
* @throws Exception
*/
public static void encode(String content, String imgPath, String destPath) throws Exception {
encode(content, imgPath, destPath, false);
}
/**
* 生成二维码
*
* @param content
* 内容
* @param destPath
* 存储地址
* @param needCompress
* 是否压缩LOGO
* @throws Exception
*/
public static void encode(String content, String destPath, boolean needCompress) throws Exception {
encode(content, null, destPath, needCompress);
}
/**
* 生成二维码
*
* @param content
* 内容
* @param destPath
* 存储地址
* @throws Exception
*/
public static void encode(String content, String destPath) throws Exception {
encode(content, null, destPath, false);
}
/**
* 生成二维码(内嵌LOGO)
*
* @param content
* 内容
* @param imgPath
* LOGO地址
* @param output
* 输出流
* @param needCompress
* 是否压缩LOGO
* @throws Exception
*/
public static void encode(String content, String imgPath, OutputStream output, boolean needCompress)
throws Exception {
BufferedImage image = createImage(content, imgPath, needCompress);
ImageIO.write(image, FORMAT_NAME, output);
}
/**
* 生成二维码
*
* @param content
* 内容
* @param output
* 输出流
* @throws Exception
*/
public static void encode(String content, OutputStream output) throws Exception {
encode(content, null, output, false);
// encode(content, null, "C:\\Users\\Vivi\\Desktop\\1.png", false);
}
// public static void main(String[] args) throws Exception {
// String text = "weixin://wxpay/bizpayurl?pr=o1RjkBTz3";
encode(text, "/Users/noahshen/Downloads/6BFAADD4-256D-447B-B742-1E1DFF11094F_meitu_1.png",
"/Users/noahshen/Downloads", true);
// encode(text, null, "C:\\Users\\Vivi\\Desktop\\1.png");
// }
}
在这里插入代码片