Springboot 服务端为App集成支付宝支付
别整什么花里胡哨的,先去吧官方文档看一遍。
首先把准备的东西准备好,这里加上一个大佬写的的连接:https://blog.****.net/vbirdbest/article/details/80635194 前期准备工作所需要的都在这里了。
登录上蚂蚁金服,点开发中心->网页&移动应用去看一下你申请的应用状态是不是已上线。
点击查看详情:
在左边导航栏找到应用信息,点开大概就可以看到你app的信息了。
你需要配置:应用网关,授权回调地址。
https://docs.open.alipay.com/291/106097/ 这是RSA**工具。具体使用可以去里面看一下。
上代码:
1、pom依赖:
<!--支付宝支付依赖-->
<dependency>
<groupId>net.guerlab</groupId>
<artifactId>sdk-alipay-starter</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.38</version>
</dependency>
2、支付宝配置文件
import java.io.FileWriter;
import java.io.IOException;
/**
* 支付宝支付基础配置文件
*/
public class AlipayConfig {
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public String app_id = "";
// 商户私钥,您的PKCS8格式RSA2私钥
public String merchant_private_key = "";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public String alipay_public_key = "";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public String notify_url = "";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
// public String return_url = "";
// 签名方式
public String signType = "RSA2";
// 字符编码格式
public String charset = "utf-8";
// 支付宝请求地址
public String gatewayUrl = "https://openapi.alipay.com/gateway.do";
// 支付宝网关
public String log_path = "C:\\";
//支付宝仅支持JSON格式
public String format="JSON";
public String getApp_id() {
return app_id;
}
public void setApp_id(String app_id) {
this.app_id = app_id;
}
public String getMerchant_private_key() {
return merchant_private_key;
}
public void setMerchant_private_key(String merchant_private_key) {
this.merchant_private_key = merchant_private_key;
}
public String getAlipay_public_key() {
return alipay_public_key;
}
public void setAlipay_public_key(String alipay_public_key) {
this.alipay_public_key = alipay_public_key;
}
public String getNotify_url() {
return notify_url;
}
public void setNotify_url(String notify_url) {
this.notify_url = notify_url;
}
// public String getReturn_url() {
// return return_url;
// }
//
// public void setReturn_url(String return_url) {
// this.return_url = return_url;
// }
public String getSignType() {
return signType;
}
public void setSignType(String signType) {
this.signType = signType;
}
public String getCharset() {
return charset;
}
public void setCharset(String charset) {
this.charset = charset;
}
public String getGatewayUrl() {
return gatewayUrl;
}
public void setGatewayUrl(String gatewayUrl) {
this.gatewayUrl = gatewayUrl;
}
public String getLog_path() {
return log_path;
}
public void setLog_path(String log_path) {
this.log_path = log_path;
}
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
public void logResult(String sWord) {
FileWriter writer = null;
try {
writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
writer.write(sWord);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3、service层:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
public interface ALiservice {
/**
* 统一下单
* @param total_fee 总价
* @param oid 订单ID
* @return
* @throws Exception
*/
Map pay(String total_fee, String oid) throws Exception;
/**
* 支付回调
* @param request
* @param response
*/
void paymentCallback(HttpServletRequest request, HttpServletResponse response);
}
4、serviceImpl层:
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@Service
public class ALiserviceImpl implements ALiservice {
private static final Logger logger = LoggerFactory.getLogger("MainLogger");
AlipayConfig alipayConfig = new AlipayConfig();
/**
* app支付接口2.0
*
* @param total_fee 总价
* @param oid 订单ID
* @return
* @throws Exception
*/
@Override
public Map pay(String total_fee, String oid) throws Exception {
try {
System.out.println("-----------------------------支付宝预支付开始------------------------------------");
// 封装请求客户端 实例化客户端 这个顺序不要动
AlipayClient client = new DefaultAlipayClient(alipayConfig.getGatewayUrl(), alipayConfig.getApp_id(), alipayConfig.getMerchant_private_key(),
alipayConfig.getFormat(), alipayConfig.getCharset(),alipayConfig.getAlipay_public_key(),alipayConfig.getSignType());
// 支付请求 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest payRequest = new AlipayTradeAppPayRequest();
// SDK已经封装掉了公共参数,这里只需要传入业务参数。
// 以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradePayModel model = new AlipayTradePayModel();
model.setSubject("测试支付宝"); //订单名称
model.setBody("测试支付宝支付"); //设置商品描述
String out_trade_no = jinOrderMapper.selectOrderNum(oid); //获取订单号
System.out.println("商户订单号------------" + out_trade_no);
model.setOutTradeNo(out_trade_no); //设置商户网站唯一订单号
model.setTotalAmount(total_fee); //设置总金额
model.setTimeoutExpress("90m"); //设置超时关闭该订单时间
model.setProductCode("QUICK_MSECURITY_PAY");//销售产品码
payRequest.setBizModel(model); //封装好的额外参数放到主请求中
payRequest.setNotifyUrl(alipayConfig.getNotify_url());//设置异步通知地址
//支付宝请求应答
AlipayTradeAppPayResponse responses = client.sdkExecute(payRequest);
System.out.println("-----------------------------支付宝应答处理开始------------------------------------");
System.out.println(responses.getBody()); // 就是orderString 可以直接给客户端请求,无需再做处理
Map<String, String> data = new HashMap<>();
data.put("body",responses.getBody()); //支付表单
return data;
} catch (Exception e) {
e.printStackTrace();
}
throw new Exception("下单失败");
}
/**
*支付回调
* @param request
* @param response
*/
@Override
public void paymentCallback(HttpServletRequest request, HttpServletResponse response) {
System.out.println("---------------------------支付宝进入异步通知--------------------------");
String resultFail = "fail";
//获取支付宝GET过来反馈信息
Map<String, String> params = new HashMap<String, String>();
Map requestParams = request.getParameterMap();
System.out.println("返回的map----------------" + requestParams);
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不相等也可以使用这段代码转化
/*try {
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}*/
params.put(name, valueStr);
}
logger.info("params={}", params);
boolean signVerified = false; //调用SDK验证签名
try {
signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipay_public_key(), alipayConfig.getCharset(), alipayConfig.getSignType());
} catch (AlipayApiException e) {
logger.error("【支付宝异步通知】支付宝回调通知失败 e={} params={}", e, params);
responseBody(response, resultFail);
return;
//e.printStackTrace();
}
if (!signVerified) {
logger.error("【支付宝异步通知】验证签名错误 params={} ", params);
responseBody(response, resultFail);
return;
}
BigDecimal trade_price = new BigDecimal(request.getParameter("total_amount"));
//商户订单号
String out_trade_no = params.get("out_trade_no");
//支付宝交易号
String trade_no = params.get("trade_no");
//交易状态
String trade_status = params.get("trade_status");
// 支付成功修改订单状态
if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) {
//业务处理,主要是更新订单状态
System.out.println("---------------------------支付成功--------------------------");
}
responseBody(response, resultFail);
return;
}
private void responseBody(HttpServletResponse response, String contentBody) {
try {
response.setContentType("type=text/javascript;charset=UTF-8");
String s = contentBody;
response.getWriter().write(s);
} catch (Exception e) {
e.printStackTrace();
}
return;
}
}
5、controller 层:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@RestController
@RequestMapping("/alipay")
public class AlipayController {
@Autowired
ALiserviceImpl aLiservice;
/**
* 支付
* @param total_fee
* @param oid
* @return
* @throws Exception
*/
@PostMapping("/apppay")
public Map pay( @RequestParam(value = "total_fee") String total_fee,@RequestParam(value = "oid") String oid) throws Exception {
return aLiservice.pay(total_fee,oid);
}
/**
* 回调
* @param request
* @param response
* @return
*/
@PostMapping("/alipayNotify")
public void alipayNotify(HttpServletRequest request, HttpServletResponse response) {
aLiservice.paymentCallback(request,response);
}
}
代码就这些,比微信的要简单。
你去请求支付宝返回的数据大概是这个样子的:
这个不用处理直接返回给安卓就行了。
要想知道他能不能调起支付宝支付。你可以安装一个APK:地址-》https://openclub.alipay.com/club/history/read/769
常见的错误就是系统繁忙ALIN10146 自查方案 地址-》:https://openclub.alipay.com/club/history/read/6918
----------------------------------------------------------------------------。-。-。-。-。-。-。-。-。-。-。-。-。-。-。-。。-。-。-
华丽结束