实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)
model.setSubject(amount);
model.setPassbackParams(URLEncoder.encode(body.toString()));; //描述信息 添加附加数据
model.setSubject(“魅格”); //商品标题
model.setBody(amount);对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
model.setTimeoutExpress(“30m”); //超时关闭该订单时间
model.setTotalAmount(amount); //订单总金额
model.setProductCode(“QUICK_MSECURITY_PAY”); //销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
model.setOutTradeNo(new SimpleDateFormat(“yyyyMMddHHmmss”).format(new Date())+(int)(Math.random()*90000+10000)); //商家订单编号
model.setGoodsType(“0”);//0虚拟产品1实物
request.setBizModel(model);
request.setNotifyUrl(alipay_notify_url); //回调地址
这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
orderStr = response.getBody();
System.out.println(orderStr);//就是orderString 可以直接给客户端请求,无需再做处理。
系统错误,请售后再试(ALI40247)
集成支付宝后一直报这个错,后来折腾了好久发现,添加的附加数据,里面有特殊符号,包含特殊符号的参数要用URLEncode编码
公钥用的是支付宝公钥
异步回调通知
response.setContentType(“text/html;charset=” + alipayProperties.getCharset());
ResponseEntity responseEntity = new ResponseEntity();
//获取支付宝GET过来反馈信息
AlipayTradeAppPayRequest Requests = new AlipayTradeAppPayRequest();
String userid=Requests.getTextParams().get(“txmUser”);
Map<String, String> 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] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
System.out.println(valueStr);
params.put(name, valueStr);
}
System.out.println(alipayProperties.getAlipayPublicKey());
String result = "";
String out_tngrade_no = "";
String trade_no = "";
try {
boolean verifyResult = AlipaySignature.rsaCheckV1(params, alipayProperties.getAlipayPublicKey(), "UTF-8", "RSA2");
if (verifyResult) {
if (params.get("trade_status").equals("TRADE_SUCCESS")) {
String amount = params.get("total_amount");
DecimalFormat df1 = new DecimalFormat("0.00");
System.out.println(params);
//验证成功
//请在这里加上商户的业务逻辑程序代码,如保存支付宝交易号
//商户订单号
out_tngrade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
//支付宝交易号
trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
//获取用户信息
String token=params.get("passback_params");
Session session = (Session) MySessionContext.getInstance().getMymap().get(token);
TxmUser user = (TxmUser) session.getAttribute("session_user");
//将获取的数据封装到实体类中
TxmRecharge txmRecharge = new TxmRecharge();
txmRecharge.setTxmrechargemoney(amount);
txmRecharge.setTxmrechargeouttradeno(out_tngrade_no);
txmRecharge.setTxmrechargetradeno(trade_no);
txmRecharge.setTxmuserid(user.getTxmuserid());
txmRecharge.setTxmrechargetime(new Date());
txmRecharge.setTxmrechargetype("0");
//新增数据到充值记录表
txmRecahrgeService.insertRecharge(txmRecharge);
//查询该用户的原有余额
String txmuserbalance = txmUserService.selectMoneyByTxmuserid(user.getTxmuserid());
String allBalance = String.valueOf(df1.format(Double.parseDouble(txmuserbalance) + Double.parseDouble(amount)));
//更新余额
int i = txmUserService.updateMoneyByTxmuserid(user.getTxmuserid(), allBalance);
String txmuserbalanced = txmUserService.selectMoneyByTxmuserid(user.getTxmuserid());
user.setTxmuserbalance(txmuserbalanced);
//把新的余额添加到session里面去
session.setAttribute("session_user", user);
//request.getSession().setAttribute("session_user", user);
if (i == 1) {
result = "success";
} else {
result = "fail";
}
}
} else {
result = "fail";
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
PrintWriter pw = response.getWriter();
pw.write(result);
pw.flush();
pw.close();
}
**最后附上工具类**
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConstants;
import com.alipay.api.DefaultAlipayClient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
public class AlipayUtil {
public static final String APP_ID = “2018101061665005”;//app_id
private static final String APP_PRIVATE_KEY = “MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCos0gX6dWTHz7G6ee1RYNXaS1Xc7GNxTwZMSRrgLt/synoWzkXvSZDOG4rraf6M0M1KyuNdiXkgPicVVMce4tDMZUjivgrnRk8FbrznfxHWP8PQkHRKt3NV851u4ZmpibLjejGgoss5XlE/vygFjrVq8iBlR/gdXUM5pt5V8qRZu1/2bQI7rSAqGstIcPf0HQeTuo12Poju4LCpvwCHJwnUJRFZFJrtfw2fhmilBJFlJAr5e6YX/geJgQTpAhJbnqeO3HAlKgP5asxNjS03yPCM8w+H2mlprAUqITm2+8ot+ElmX+THUzUQAjwrZMzHcwBhwpeFcBWPjzlnR5f/v0TAgMBAAECggEAPzUlHuibAAul7st26IFKC7c5qNmNPgwXT20NM0ZBekA7xHZhdtaE/oynIrBnDqSkWsh5AgCxg+MawyBpCnPzotJyCaYpA9ZRvSR7LooUGvtqXWI63M8N2cE7dvszCUTZpkzeWXpSARldjY9oQebyVlqNvpeMIQKBP7srp5RQLpffZQ7GuA9Ahxxn2eRSURB5MAJfMkOGaCWGCbi4UvUfXh/Oltnvnlp1Hre/dA+o1L5OV+h57n5rHfzB44DqWQIaWyUsECqaUBoMq+f4SHdtAgZ3liF4fo1F5JMUprQQuIIX3TjhsJdEpHhXxiGgNRj8WJa+Dgt9MAWs/8dDtErxeQKBgQDy8BvCbfBeE9Jh6OUpbpYz57RpVBWwf5UxN3fwjp2A4Sj/kbW1+PGLcJSLXptuBF0cV4oDsag05SmpMRgXKgOuMEOgSA2i2Ukmj81JrtBM3O9T5hpsiWvJ2jQrGLUsPBpAPnLRkYwo1Q9lgcY9UIg0DUbQkjkTmrZugpF6pcYLHwKBgQCxxVaLlR0g7X+xJYAV+zj/RHFfVhAjVKUcyagFyx5qltjEOafZt2Xq1XqljD17mep9beNQ8nQQHg7MlWOWBlwdlGQl8hqBh+1W6jHLy2VzPkQBRwvKQ7bS0UgU2k+CtQn3m/GSn6aADAYm0mFdAjaqAVWEvNKZ6LdjZ8P4GIaDjQKBgECZjpgmCdvKY5A7kOxyhqhovbWgcWAMnQyIVnF2SvWhafiDs5EfEIPmvOlOkAAyUtwdfwq6bCMcqPZfoqtONcpU9Tai0lVyeBwz8v/b53H48f8aWf5wkGQNjP/EwzBvDv/0Wy3VCTM2bLCuUJuvVXiZ6zG9IEZRRp+eQrcda8s7AoGANMkn/aJ1V8Wt2OgNtHk4X3PvRiPD/vmvXXDzl2TMz1GjZADKunceqDBjjqypxP3bBwuOKAcWN4L1WgIx4+ZXi+D4K9xLypKWAuzfhGgM479laguykIiyzL6f7LE2UtV29DM19Be71OG9IeHuTzPND4X94sA+uLzFV5sEMbL2njECgYBgAseeS+4xu6c5RRIbNsV5EKzadwRNCrQZpUDvxLA+iIWUvumDgqNZObQajzx8M+5Z9M9aMFZoz+nx9Sk4dbHPjvjx6VAv5tIMZIVXCFUf4BKwoh4ir+8xbxtHmsPynvo7goh9BD55REq65UMfT92wvBvu6LT1AUK8RnPl4WRRAw==”;//支付宝的私钥
public static final String ALIPAY_PUBLIC_KEY = “MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqLNIF+nVkx8+xunntUWDV2ktV3OxjcU8GTEka4C7f7Mp6Fs5F70mQzhuK62n+jNDNSsrjXYl5ID4nFVTHHuLQzGVI4r4K50ZPBW68538R1j/D0JB0SrdzVfOdbuGZqYmy43oxoKLLOV5RP78oBY61avIgZUf4HV1DOabeVfKkWbtf9m0CO60gKhrLSHD39B0Hk7qNdj6I7uCwqb8AhycJ1CURWRSa7X8Nn4ZopQSRZSQK+XumF/4HiYEE6QISW56njtxwJSoD+WrMTY0tN8jwjPMPh9ppaawFKiE5tvvKLfhJZl/kx1M1EAI8K2TMx3MAYcKXhXAVj485Z0eX/79EwIDAQAB”;//这个为你在支付宝上的商户的公钥,而不是支付宝公钥
@Value(“pay.alipay.alipayPublicKey”)
public static String ALIPAY_ZHI_KEY ;
public static final String SIGNTYPE = “RSA2”;//算法
public static final String NOTIFYURL = “xxxxx”;//支付宝回调的借口
//public static final String RETURNURL = “xxxxxxx”;//支付宝回调的借口
private static AlipayClient alipayClient = null;//因为支付宝alipayClient本身是线程安全的,因此只用创建一个,创建成单例的模式
public static AlipayClient getAlipayClient() {
if (alipayClient == null) {
synchronized (AlipayUtil.class) {//AlipayConstants.CHARSET_UTF8
if (null == alipayClient) {//https://openapi.alipay.com/gateway.do https://openapi.alipaydev.com/gateway.do
alipayClient = new DefaultAlipayClient(“https://openapi.alipay.com/gateway.do”, APP_ID,
APP_PRIVATE_KEY, AlipayConstants.FORMAT_JSON, AlipayConstants.CHARSET_UTF8,ALIPAY_ZHI_KEY,SIGNTYPE);
}
}
} return alipayClient;
}
public static String getAlipayZhiKey() {
return ALIPAY_ZHI_KEY;
}
public static void setAlipayZhiKey(String alipayZhiKey) {
ALIPAY_ZHI_KEY = alipayZhiKey;
}
}