扫码支付
企业使用支付宝支付的话,需要先进行账户的接入支付
接入支付文档链接: https://opendocs.alipay.com/open/0128wr
接入支付文档视频: https://www.kuangstudy.com/course/play/1377518279077142529#ksd_1381861907484418050_1381862218542391297
ps : 该视频来自于学相伴
企业接入完成后可以得到以下参数:
- appId
- 回调地址
- 应用私钥:
- 支付宝公钥
以上参数都开发支付需要必须参数
还有一个参数: 支付宝请求地址 这个参数是每个请求接口都不一样的,扫码支付的请求地址是: https://openapi.alipay.com/gateway.do
支付文档链接: https://opendocs.alipay.com/apis
可以参数阿里云官方文档
得到以上参数后可以进行开发了
可以使用阿里云的沙箱环境提供的参数进行开发测试,等公司接入完成后再将参数进行替换
沙箱文档官方链接: https://opendocs.alipay.com/open/200/105311
沙箱环境下生成的二维码需要下载阿里云提供的支付宝(沙箱版)扫码
下面开始代码开发
先介绍环境,我使用的是springboot进行开发的
第一步:导入支付宝依赖
<!--支付宝支付相关-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.0.0</version>
</dependency>
第二步:
- appId
- 回调地址
- 应用私钥:
- 支付宝公钥
- 请求地址
上面的参数可以写在数据库里面,也可以写在配置文件里面。看自己需求,这一步我就省略了,没啥技术含量
第三步:
创建controller文件,传入金额,描述…一系列的订单信息。也是看自己需求.这一步我也省略了,没啥技术含量
第四步:
业务层,也就是真正请求支付宝,然后支付宝返回支付二维码链接的业务逻辑,建议抽取成工具类,以便以后的复用
上代码:
JSONObject jsonObject = new JSONObject(); // 返回controller的类型,可以根据自己需求进行来操作
AlipayClient alipayClient = new DefaultAlipayClient("支付宝请求地址", "支付宝应用ID,也就是appId", "支付宝商户私钥", "JSON", "UTF-8", "支付宝商户公钥", "RSA2");
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setNotifyUrl("支付宝回调地址");
JSONObject json = new JSONObject(); // 这个东西里面都是自定义的
json.put("out_trade_no", "订单编号,这个订单编号是你自己生成订单编号");
json.put("total_amount", "订单金额";
json.put("subject", "订单描述,也可以里面写自己的其他的东西,看自己需求");
// 下面可以写一些自己的东西,例如: key value这种类型的,自定义
json.put("公司名称", "公司名称");
String params = json.toString(); // 支付的请求体参数
// 支付信息的参数
// 6:设置支付相关的信息 必须要给的
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setOutTradeNo("自定义订单号"); //
model.setTotalAmount("支付金额");//
model.setSubject("支付的产品名称");//
model.setBody(params);
model.setTimeoutExpress("支付的超时时间");
request.setBizModel(model);
AlipayTradePrecreateResponse response = null;
try {
response = alipayClient.execute(request);
if (response.isSuccess()) {
jsonObject.put("code", 200);
jsonObject.put("message", "调用成功");
jsonObject.put("outTradeNo", response.getOutTradeNo()); // 支付宝生成的支付宝的订单号,可以根据这个进行查询账单啥的,建议保存下来
jsonObject.put("qrCode", response.getQrCode()); // 支付宝返回的二维码链接,可以根据这个链接生成二维码
return jsonObject;
} else {
log.error("调用返回结果失败,错误码=>" + response.getCode());
log.error("调用返回结果失败,错误内容=>" + response.getMsg());
jsonObject.put("code", 301);
jsonObject.put("message", "调用失败");
return jsonObject;
}
} catch (AlipayApiException e) {
e.printStackTrace();
log.error("调用发生异常,错误码==>" + e.getErrCode());
log.error("调用发生异常,错误内容==>" + e.getErrMsg());
jsonObject.put("code", 301);
jsonObject.put("message", "调用失败");
return jsonObject;
}
推荐一个二维码在线生成器,可以将上面返回的链接放上面测试一下,看看是否正确
https://www.bejson.com/convert/qrcode/
第五步:
能做到这里证明你已经生成了二维码,用户扫码支付成功后,支付宝会想之前的写好的回调地址发送数据,告诉这个回调地址,订单的详细信息和状态
前提是这个回调地址必须是线上的,要不然接收不到
成功接受到支付宝的回调信息后,就可以根据里面的信息根据自己的实际的业务进行操作了
上代码:
controller层
/**
* 支付宝回调地址
*/
@CrossOrigin
@ResponseBody
@RequestMapping("你的地址")
public String 你的方法名称(HttpServletRequest request) {
// 1: 调用支付回调
boolean result = tupjogService.alipayCallback(request);
if (result) {
return "success"; // 请不要修改或删除,因为是支付宝规定的
} else {
// 验证失败
return "fail"; // 请不要修改或删除,因为是支付宝规定的
}
}
service层
// 1:获取支付宝GET过来反馈信息
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] + ",";
}
params.put(name, valueStr);
}
// 返回公共参数 支付宝交易号
String tradeno = params.get("trade_no");
// 获取交易状态,我下面没做判断,你按照你自己的需求操作
String tradeno = params.get("notify_type");
//支付返回的请求参数body
String bodyJson = params.get("body");
try {
JSONObject bodyJsonObject = JSONObject.parseObject(bodyJson);
// 获取订单编号
String ptype = bodyJsonObject.getString("out_trade_no");
// 获取订单金额
String totalAmount = bodyJsonObject.getString("total_amount");
// 获取订单描述
String subjectS = bodyJsonObject.getString("subject");
// 获取公司名称 这些都是生成二维码链接时规定好的key,根据key获取对应的value
String pumc = bodyJsonObject.getString("pumc");
log.info("---->:【支付宝】交易的参数信息是:ptype:{},orderNumber是:{},subject是:{},pumc是:{}", ptype, totalAmount, subject, pumc);
// 订单支付成功,保存的订单交易明细,根据自己业务操作
} catch (Exception ex) {
log.error("支付宝支付出现了异常....." + ex.getMessage());
ex.printStackTrace();
return false;
}
return true;
到此为止,支付宝的扫码支付就完事了,总结流程如下:
- 企业接入支付宝,得到对应的参数:
- appId
- 回调地址
- 应用私钥:
- 支付宝公钥
- 请求地址
- 调用支付宝扫码支付接口,传入参数,生成二维码链接
- 将二维码链接生成二维码展示给用户,用户进行扫码支付
- 用户支付成功后,支付宝会自动向之前的规定好的回调地址发送订单详细信息
- 回调地址收到支付宝的回调后,你根据自己需求对参数解析和对订单进行后续操作
完事收工