对接支付宝当面付生成二维码
前言
前几天突然告诉我要对接一个新项目,开发一个支付宝支付得功能,最后研究一下获取支付宝二维码字符串在前台生成二维码比较适合我们得项目.
一、开发前准备
1.首先需要前往支付宝开放平台注册个人账号
注册网址:https://open.alipay.com/dev/workspace
2.在申请成功后选择沙箱工具(否则申请应用会耽误一阵时间)
登录成功后选择左下角沙箱
3.在沙箱账号中获取我们需要得参数
如测试用的 appid , pid 在接口加密方式选择公钥模式点击查看可以看到对应的 应用公钥,应用私钥,支付宝公钥等等.
二、使用步骤
1.将支付宝需要的依赖引入到我们maven得pom.xml中
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.31.7.ALL</version>
</dependency>
2.在项目中配置参数
在application.yml中添加支付宝得相关参数
注意:异步回调地址一定要外网可以访问到 局域外网和内网都不符合要求!!!
3.创建支付宝properties文件 创建get 和 set方法
4.在controller中写获取支付宝二维码的字符串的方法 和异步通知的方法 建议使用post请求 可参考文档https://opendocs.alipay.com/open/194/106078 编写代码
在向支付宝发送请求成功后
AlipayTradePrecreateResponse response = null;
response = alipayClient.execute(request);
在response中有一个getQrCode方法
这个就是获取支付宝二维码字符串得方法,测试时可在控制台输出这个字符串,复制这个字符串到草料二维码生成器中看这个二维码是否正确,生成得二维码可以用沙箱账号扫一扫付款.
5.异步回调接收以及验签参考使用 可以去支付宝官网找到这部分代码
System.out.println("--开始接收支付宝回调信息--");
Map<String, String> params = new HashMap<String, String>();
try {
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] + ",";
}
//乱码解决,这段代码在出现乱码时使用
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
boolean alipayflag = AlipaySignature.verifyV1(params,alipayProperties.getAlipayPublicKey(),alipayProperties.getCharSet(),alipayProperties.getSignType());
if(alipayflag){
System.out.println("success");
}
else{
this.setSuccess(false);
this.setMessage("验签失败");
}
System.out.println(alipayflag);
}catch (Exception e){
System.out.println(e);
}
PrintWriter writer = null;
try {
writer = response.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(params);
String Paytime =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
String PayState = "1";
writer.write("success"); // 一定要打印success,否则支付宝会一直发送请求 writer.flush();
总结
开发遇到的问题
开发环境属于局域内网无法被支付宝访问到 所以使用内外网穿透工具ngrok
之前一直用花生壳 但是前不久花生壳的htpp请求失效 换了这个内外网穿透工具供测试使用 .
开发思路
首先保证支付宝的所有代码 可以被互联网访问到
1.取业务数据 生成支付宝二维码
2.异步接收用户扫完二维码的回调通知
3.对回调的数据进行验签
4.验签成功后改变人员状态
5.遇到问题可以去支付宝开放平台找人工问清楚