java的uniapp版本的支付宝app支付
准备工作
1.先准备企业账号,然后创建应用,如图所示
创建应用获取app支付的能力并签约
2.根据官方文档生成公钥私钥
支付宝官方地址
先贴代码
相关配置
package com.yss.utlis.ali;
public class AlipayConfig {
// 1.商户appid
public static String APPID = "";
//2.私钥 pkcs8格式的
public static String RSA_PRIVATE_KEY = "";
// 3.支付宝公钥
public static String ALIPAY_PUBLIC_KEY = "";
// 4.服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://baidu.com:9524/aliPay/getAliPayType";
//5.页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
public static String return_url = "www.baidu.com";
// 6.请求支付宝的网关地址
public static String URL = "https://openapi.alipay.com/gateway.do";
// 7.编码
public static String CHARSET = "UTF-8";
// 8.返回格式
public static String FORMAT = "json";
// 9.加密类型
public static String SIGNTYPE = "RSA2";
//10.签约产品代码
public static String QUICK_MSECURITY_PAY = "QUICK_MSECURITY_PAY";
}
工具类代码
package com.yss.utlis.ali;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.yss.base.auth.utils.ApiResult;
import com.yss.base.msg.expection.BadRequestException;
import com.yss.pay.model.entity.AliOrder;
import com.yss.sys.model.entity.Combo;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class AliPayUtils {
/**
* 根据传过来的套餐id跳转支付宝支付
*
* @return
* @Param id 套餐id
*/
public static String pay(AliOrder aliOrder) {
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID,
AlipayConfig.RSA_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
AlipayConfig.SIGNTYPE);
//实例化客户端
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody(aliOrder.getBody());
model.setSubject(aliOrder.getSubject());
model.setOutTradeNo(aliOrder.getOutTradeNo());
model.setTimeoutExpress("30m");
model.setTotalAmount(String.valueOf(aliOrder.getTotalAmount()));
model.setProductCode(AlipayConfig.QUICK_MSECURITY_PAY);
request.setBizModel(model);
request.setNotifyUrl(AlipayConfig.notify_url);
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
request.setNotifyUrl(AlipayConfig.notify_url);
System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
return response.getBody();
} catch (AlipayApiException e) {
throw new BadRequestException("支付失败");
}
}
public static boolean getType(Map<String, String> params) throws AlipayApiException {
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
return AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
}
public static Boolean aliPayRefund(AliOrder aliOrder) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID,
AlipayConfig.RSA_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
AlipayConfig.SIGNTYPE);
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeRefundModel refundModel = new AlipayTradeRefundModel();
refundModel.setOutTradeNo(aliOrder.getOutTradeNo());
refundModel.setRefundAmount(String.valueOf(aliOrder.getTotalAmount()));
refundModel.setRefundReason("商品退款");
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
request.setBizModel(refundModel);
AlipayTradeRefundResponse response = alipayClient.execute(request);
System.out.println(response);
if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
return response.isSuccess();
}
}
支付部分给前端返回的是携带了订单的信息的通道,前端直接根据这个通道调取支付宝就可以进行支付了
/**
* 使用支付宝支付
* @param id 套餐id
* @return
*/
@PostMapping("aliPay/{id}")
@ApiOperation("使用支付宝支付")
public ApiResult<String> aliPay(@PathVariable String id){
return new ApiResult<>(aliOrderService.aliPay(id));
}
/**
* 响应支付宝支付状态
* @return
*/
@PostMapping("/getAliPayType")
@ApiOperation("响应支付宝支付状态")
public ApiResult<Boolean> getAliPayType(HttpServletRequest request){
return new ApiResult<>(aliOrderService.getAliPayType(request));
}
/**
* 支付宝退款
* @return
*/
@PostMapping("/aliPayRefund")
@ApiOperation("支付宝退款")
public ApiResult<Boolean> aliPayRefund(String id){
try {
return new ApiResult<>(aliOrderService.aliPayRefund(id,null));
} catch (Exception e) {
throw new BadRequestException("退款失败");
}
}
service代码
package com.yss.pay.service.impl;
import com.alipay.api.AlipayApiException;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.yss.base.auth.utils.SecurityUtils;
import com.yss.base.model.user.User;
import com.yss.base.msg.expection.BadRequestException;
import com.yss.base.service.user.UserService;
import com.yss.base.utils.StringUtils;
import com.yss.ope.model.entity.UserOrder;
import com.yss.ope.service.UserOrderService;
import com.yss.pay.model.entity.AliOrder;
import com.yss.pay.mapper.AliOrderMapper;
import com.yss.pay.service.AliOrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yss.sys.model.entity.Combo;
import com.yss.sys.service.ComboService;
import com.yss.utlis.ali.AliPayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
/**
* <p>
* 支付宝订单历史记录 服务实现类
* </p>
*
* @author yinna
* @since 2020-11-07
*/
@Service
public class AliOrderServiceImpl extends ServiceImpl<AliOrderMapper, AliOrder> implements AliOrderService {
@Autowired
private ComboService comboService;
@Autowired
private UserOrderService userOrderService;
@Autowired
private UserService userService;
/**
* 根据套餐id发起支付宝支付
* @param id
* @return
*/
@Override
public String aliPay(String id) {
//代码逻辑
return AliPayUtils.pay(aliOrder);
}
/**
* 退款
* @param id
* @return
*/
@Override
public Boolean aliPayRefund(String id,String orderId) {
//代码逻辑
try {
if (AliPayUtils.aliPayRefund(aliOrder)){
//代码逻辑
}else {
return false;
}
} catch (AlipayApiException e) {
e.printStackTrace();
throw new BadRequestException("退款失败");
}
}
/**
* 支付宝支付回调接口
* @param request
* @return
*/
@Override
public Boolean getAliPayType(HttpServletRequest request) {
//获取支付宝POST过来反馈信息
Map<String, String> params = new HashMap<String, String>();
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] + ",";
}
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
System.out.println(params + "\n--------------------------------------");
try {
if (AliPayUtils.getType(params)){
//回调成功代码逻辑
}else {
return true;
}
}
return false;
} catch (AlipayApiException e) {
throw new BadRequestException("支付失败");
}
}
}