支付宝扫码支付示例源码
支付宝扫码付,相对来说根据开发文档开发的话,基本上可以一遍过的.直接上代码.
controller:
@RequestMapping(value = {"/api/alijspay"})
@RestController
@Slf4j
@Api(value = "alipay扫码支付相关",tags = "alipay扫码支付相关")
public class AliJSPayController extends BaseController {
@Autowired
private lAliPayService aliPayService;
@PostMapping("/payRequest")
@ApiOperation("统一下单alipay支付.")
public Result payRequest(HttpServletResponse responses, @RequestBody MallOrderJSPayDto mallOrderJSPayDto) throws Exception {
log.info("ali 支付:{}",mallOrderJSPayDto);
try {
Map<String,String> map = aliPayService.jsPayRequest(responses,mallOrderJSPayDto);
return super.success(map);
} catch (Exception e) {
log.info("订单ali支付异常:{}",e);
return super.error("订单数据异常!");
}
}
@PostMapping(value = "/aliPayOrderCallBack")
@ApiOperation("alipay支付回调")
public Map<String, String> aliPayOrderCallBack(HttpServletRequest request){
Map<String, String> map = new HashMap<String, String>();
try {
AliPayVO aliPayVo = aliPayService.aliJsPayCallBack(request);
aliPayService.aliJsPayOrderCallBack(aliPayVo);
map.put("msg", "SUCCESS");
} catch (Exception e) {
e.printStackTrace();
log.error("aliPayOrderCallBack Error.",e);
}
return map;
}
@PostMapping(value = "/getAliJspayStaus")
@ApiOperation("alipay扫码付状态查询")
public Result getAlijspayStaus(@RequestParam("orderId")String orderId){
Map<String, Object> map = new HashMap<String, Object>();
try {
map = aliPayService.getAlijspayStaus(orderId);
return super.success(map);
} catch (Exception e) {
e.printStackTrace();
log.error("aliPayOrderCallBack Error.",e);
}
return super.error();
}
}
service:
public interface FriendsMallAliPayService {
//支付宝扫码支付
public Map<String,String> jsPayRequest(HttpServletResponse responses, MallOrderJSPayDto mallOrderPayDto) throws Exception;
//支付宝扫码付订单状态查询
public Map<String, Object> getAlijspayStaus(String orderId) throws Exception;
//支付宝扫码付支付宝回调
public AliPayVO aliJsPayCallBack(HttpServletRequest request) throws Exception;
//支付宝扫码付订单支付回调业务处理
public void aliJsPayOrderCallBack(AliPayVO aliPayVo) throws Exception;
}
Impl:
@Override
public Map<String,String> jsPayRequest(HttpServletResponse responses, MallOrderJSPayDto mallOrderPayDto) throws Exception {
//TODO 要查库.获取配置-扫码付单独一套支付库表
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setUrl(Consts.ALIPAY_REQUEST_URI);
alipayConfig.setAppId("");//appId
alipayConfig.setRsaPrivateKey("");//私钥
alipayConfig.setAlipayPublicKey("");//公钥
alipayConfig.setCharset(Consts.ALIPAY_CHARSET);//编码格式
alipayConfig.setFormat(Consts.ALIPAY_FORMAT);//返回格式
alipayConfig.setSignType(Consts.ALIPYA_SIGNTYPE);//签名方式
//实例化客户端
log.info("实例化客户端开始=====================");
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getUrl(), alipayConfig.getAppId(),
alipayConfig.getRsaPrivateKey(), alipayConfig.getFormat(), alipayConfig.getCharset(),
alipayConfig.getAlipayPublicKey(), alipayConfig.getSignType());
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();//创建API对应的request类
Map<String,Object> map=new HashMap<>();
//设置回调地址
request.setNotifyUrl(Consts.ALIJSPAY_ORDER_CALLBACK);
//根据订单号查询订单信息
Map<String,Object> maps=new HashMap<>();
String orderNum = PayUtils.getOrderNumber();
log.info("支付订单号:{}",orderNum);
maps.put("out_trade_no",orderNum);
//TODO 测试使用
maps.put("total_amount","0.01");
maps.put("subject",subject);
maps.put("timeout_express",Consts.TIMEOUT_EXPRESS);
//把订单信息转换为json对象的字符串
String postdata = new JSONObject(maps).toString();
request.setBizContent(postdata);
AlipayTradePrecreateResponse response = alipayClient.execute(request);
String body = response.getBody();
log.info("body:{}",body);
JSONObject jsonObject = JSONObject.parseObject(body);
log.info("jsonObject:{}",jsonObject);
String qr_code = jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code");
log.info("qr_code:{}",qr_code);
byte[] bytes = QRCodeUtil.encodeReturnFile(qr_code);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
//转成File 上传阿里云
MultipartFile temFile = new MockMultipartFile("file", byteArrayInputStream);
byteArrayInputStream.close();
String url = ossUtil.upload(temFile);
log.info("url:{}",url);
Map<String,String> mapReturn = Maps.newHashMap();
mapReturn.put("url",url);
mapReturn.put("orderNum",orderNum);
return mapReturn;
}
@Override
public Map<String, Object> getAlijspayStaus(String orderId) throws Exception {
//TODO 要查库.获取配置 -扫码付单独一套
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setUrl(Consts.ALIPAY_REQUEST_URI);
alipayConfig.setAppId("");//appId
alipayConfig.setRsaPrivateKey("");//私钥
alipayConfig.setAlipayPublicKey("");//公钥
alipayConfig.setCharset(Consts.ALIPAY_CHARSET);//编码格式
alipayConfig.setFormat(Consts.ALIPAY_FORMAT);//返回格式
alipayConfig.setSignType(Consts.ALIPYA_SIGNTYPE);//签名方式
//实例化客户端
log.info("实例化客户端开始=====================");
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getUrl(), alipayConfig.getAppId(),
alipayConfig.getRsaPrivateKey(), alipayConfig.getFormat(), alipayConfig.getCharset(),
alipayConfig.getAlipayPublicKey(), alipayConfig.getSignType());
//创建API对应的request类
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
Map<String,Object> map=new HashMap<>();
map.put("out_trade_no",orderId);
String returndata = new JSONObject(map).toString();
//设置业务参数
request.setBizContent(returndata);
//通过alipayClient调用API,获得对应的response类
AlipayTradeQueryResponse response = alipayClient.execute(request);
JSONObject jsonObject = JSONObject.parseObject(response.getBody()).getJSONObject("alipay_trade_query_response");
String code = jsonObject.getString("code");
String msg = jsonObject.getString("msg");
Map<String,Object> returnmap=new HashMap<>();
if (code.equals("10000") && msg.equals("Success"))
{
System.out.println("交易查询请求成功");
String trade_status = jsonObject.getString("trade_status");
if (trade_status.equals("TRADE_SUCCESS"))
{
returnmap.put("type","1");
returnmap.put("data","支付成功");
}else {
returnmap.put("type","0");
returnmap.put("data",trade_status);
}
}else {
System.out.println("交易查询请求失败");
returnmap.put("type","0");
returnmap.put("data",jsonObject.getString("sub_msg"));
System.out.println(jsonObject);//返回失败信息
}
return returnmap;
}
@Override
public AliPayVO aliJsPayCallBack(HttpServletRequest request) throws Exception {
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setUrl(Consts.ALIPAY_REQUEST_URI);
alipayConfig.setAppId("");//appId
alipayConfig.setRsaPrivateKey("");//私钥
alipayConfig.setAlipayPublicKey("");//公钥
alipayConfig.setCharset(Consts.ALIPAY_CHARSET);//编码格式
alipayConfig.setFormat(Consts.ALIPAY_FORMAT);//返回格式
alipayConfig.setSignType(Consts.ALIPYA_SIGNTYPE);//签名方式
//获取支付宝反馈信息
Map<String, String> params = new HashMap<String, String>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> 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] + ",";
}
params.put(name, valueStr);
}
//调用SDK验证签名
boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipayPublicKey(), alipayConfig.getCharset(), alipayConfig.getSignType());
//校验签名
if (!signVerified) {
log.error("1.支付宝支付回调签名不正确");
throw new Exception("支付宝支付回调签名不正确");
}
//校验支付状态
if (!request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
log.error("2.支付宝支付回调支付状态不正确");
throw new Exception("支付宝支付回调支付状态不正确");
}
AliPayVO aliPayVo = new AliPayVO();
//商户订单号-系统生成订单号
String outTradeNo = request.getParameter("out_trade_no");
aliPayVo.setOutTradeNo(outTradeNo);
//支付订单号-阿里28位订单号
String tradeNo = request.getParameter("trade_no");
aliPayVo.setPayOrderNo(tradeNo);
//交易状态
String tradeStatus = request.getParameter("trade_status");
aliPayVo.setTradeStatus(tradeStatus);
//资金总额
String totalAmount = request.getParameter("total_amount");
aliPayVo.setTotalAmount(totalAmount);
//卖家支付宝账户
String sellerId = request.getParameter("seller_id");
aliPayVo.setSellerId(sellerId);
//买家支付宝账户
String buyerLogonId = request.getParameter("buyer_logon_id");
aliPayVo.setBuyerLogoinId(buyerLogonId);
//签名方式
aliPayVo.setSignType(alipayConfig.getSignType());
//签名
String sign = request.getParameter("sign");
aliPayVo.setSign(sign);
return aliPayVo;
}
@Override
public void aliJsPayOrderCallBack(AliPayVO aliPayVo) throws Exception {
log.info("3.alipay 回调开始============:{}",aliPayVo);
if (aliPayVo != null && StringUtil.isNotEmpty(aliPayVo.getOutTradeNo())) {
synchronized (aliPayVo.getOutTradeNo()) {
MallUserRechargeDetail order = friendsMallUserRechargeDetailService.selectByOrderId(aliPayVo.getOutTradeNo());
if (order.getStatus().equals(0)) {
if (aliPayVo.getTradeStatus().equals("TRADE_FINISHED")) {
//交易创建,等待买家付款
log.info("4.交易创建,等待买家付款:TRADE_FINISHED");
} else if (aliPayVo.getTradeStatus().equals("WAIT_BUYER_PAY")) {
//未付款交易超时关闭,或支付完成后全额退款
log.info("5.未付款交易超时关闭,或支付完成后全额退款:WAIT_BUYER_PAY");
} else if (aliPayVo.getTradeStatus().equals("TRADE_CLOSED")) {
//交易结束,不可退款
log.info("6.交易结束,不可退款:TRADE_CLOSED");
} else if (aliPayVo.getTradeStatus().equals("TRADE_SUCCESS")) {
//交易支付成功
log.info("7.支付状态成功:TRADE_SUCCESS");
}
} else {
log.info("29.该订单已支付处理,交易编号为: " + aliPayVo.getOutTradeNo());
}
}
}
}
uploadUtil:
public String upload(MultipartFile file) throws IOException {
InputStream inputStream = file.getInputStream();
try {
String currentTimeFile = new DateTime(System.currentTimeMillis()).toString("yyyy_MM_dd_HH_mm_ss_SSS");
//获取文件后缀
String name2 = FileUtil.getExtensionName(file.getOriginalFilename());
if (Objects.isNull(name2) || "".equals(name2)){
name2 = "jpg";
}
String newFileName = "friends" + "_"
+ currentTimeFile
+ "."
+ FileUtil.getExtensionName(file.getOriginalFilename());
log.info("newFileName:{}", newFileName);
// 上传路径
String ossFullPath = "";
//TODO 路径规则待需求确认之后再修改 ->最优格式lesson/tag/version/course.zip
ossFullPath = new StringBuilder()
.append(Consts.FRIENDS).append(Consts.SEPARATOR).append(currentTimeFile).append(Consts.SPOT).append(name2)
.toString();
log.info("ossFullPath1:{}", ossFullPath);
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("image/jpg");
ossConfig.getOssClient().putObject(ossConfig.getBucketName(), ossFullPath, inputStream,objectMetadata);
Date expiration = new Date(System.currentTimeMillis() + ossConfig.getExpiration());
String url = ossConfig.getOssClient().generatePresignedUrl(ossConfig.getBucketName(), ossFullPath, expiration).toString();
log.info("oss上传返回url:{}",url);
return url;
} catch (Exception e) {
log.info("上传异常:{}");
return null;
}finally {
try {
if (null != inputStream){
inputStream.close();
inputStream =null;
}
} catch (IOException e) {
log.info("流关闭异常,忽略!");
}
}
}
Consts:
public class Consts {
//支付宝请求路径
public static final String ALIPAY_REQUEST_URI = "https://openapi.alipay.com/gateway.do";
//支付宝编码格式
public static final String ALIPAY_CHARSET = "utf-8";
//支付宝返回格式
public static final String ALIPAY_FORMAT = "json";
//支付宝签名方式
public static final String ALIPYA_SIGNTYPE = "RSA2";
//支付宝APP回调地址
public static final String ALIPAY_ORDER_CALLBACK = "http://127.0.0.1:8040/api/alipay/aliPayOrderCallBack";
//支付宝扫码付回调地址
public static final String ALIJSPAY_ORDER_CALLBACK = "http://127.0.0.1:8040/api/alijspay/aliPayOrderCallBack";
//支付宝订单过期时间
public static final String TIMEOUT_EXPRESS = "30m";
//微信的package
public static final String PACKAGE_VALUE = "Sign=WXPay";
//微信支付类型 -APP
public static final String TRADE_TYPE_APP = "APP";
//微信支付类型 -NATIVE
public static final String TRADE_TYPE_NATIVE = "NATIVE";
//微信签名方式-回调使用
public static final String SIGN_TYPE = "ASCII";
//订单支付微信回调地址
public static final String TENPAY_ORDER_CALLBACK = "http://127.0.0.1:8040/api/tenpay/tenPayOrderCallBack";
//微信二维码回调地址
public static final String TENPAY_QR_CALLBACK = "http://127.0.0.1:8040all/api/wxjspay/tenPayOrderCallBack";
}