1.首次知道,原来(支付宝支付接口)需要去蚂蚁金服开发者帮助文档(尴尬)。
附带链接地址:https://docs.open.alipay.com
2.创建自己的应用,我选的是【自研接入】(这是一个坑,如果不是企业级应用,不能签约,所有扫码支付功能并不能使用),创建应用的时候选择【支付接入】
3.有一个很坑爹的步骤:上传图标的时候,在屏幕的最右边有一个编辑按钮(我的天,我还以为我发现支付宝的一个BUG呢)
(注:上传图标要注意(不能为人物和动物头像))
4.生成RSA 密钥,下载支付提供的工具(windows 和 mac 俩个版本),生成以后,点击工具右下角有一个上传公钥,这里我详细的说一下,一共有三个(俩个是我们自己生成的,公钥,私钥,这俩个上传之后会生成一个支付的公钥)。
5.所有之前的都是准备工作,下面才是重头戏,支付宝提供的是SDK,但是我们使用的是maven 搭建的spring-boot项目,所以我们先找一下有没有支付宝maven 依赖。
com.alipay.sdk
alipay-sdk-java
3.4.27.ALL
6.在这里我还要提一下,我自己要做的事情,是支付宝扫码支付,所以我贴上一张支付流程图
支付宝扫码支付流程图
7.本地如果想调用第三方接口,需要有自己的域名,或者配置内网穿透(我下载的是花生壳,想必大家都听说过哈 ,当然也不是免费的 6块大洋)
8.我们要调用第三方的接口,需要组装对应的AlipayTradePrecreateRequest请求
9.然后调用支付宝的响应请求AlipayTradePrecreateResponse ,下单(这个单官方已经给您解释了,按照人家规定的组装就可以了)
10.截取一些比较重要的代码环节
常用参数配置类
public class AlipayConfig {
//ServiceURL 设置网关
public static String ServiceUrl="https://openapi.alipay.com/gateway.do";
//APP支付宝支付业务:app_id
public static String app_id = "你的项目APPID";//例:2016082600317257
// 商户的私钥,使用支付宝自带的openssl工具生成。
public static String private_key = "你的私钥";
// 应用的公钥,无需修改该值
public static String ali_public_key = "";
// 支付宝的公钥,去open.alipay.com对应应用下查看。
public static String zfb_public_key="";
// 字符编码格式 目前支持 gbk 或 utf-8
public static String input_charset = "UTF-8";
}
二维码生成 Controller
@RequestMapping(value="/alipay")
@ApiOperation(value = "支付宝支付--下订单--返回二维码数据流")
public String ailipay(@RequestParam @ApiParam(required = true,name = "车牌号码") String licensePlateNumber,HttpServletResponse servletResponse) throws AlipayApiException {
// 拼装客户端
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.ServiceUrl,AlipayConfig.app_id,
AlipayConfig.private_key,"json",AlipayConfig.input_charset,AlipayConfig.zfb_public_key,"RSA2");
// 支付宝 request
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
String subject = "华安停车支付宝支付测试";
String totalAmount = "0.01";
String storeId = "123";
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setSubject(subject);
model.setTotalAmount(totalAmount);
model.setStoreId(storeId);
model.setTimeoutExpress("5m");
//商品订单号码 out_trade_no 商户订单号,64个字符以内、只能包含字母、数字、下划线;需保证在商户端不重复
model.setOutTradeNo(UUID.randomUUID().toString());
request.setBizModel(model);
//request.set
// 支付宝 response 这里已经对相应结果解析了。返回值
AlipayTradePrecreateResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
String code = response.getQrCode();
//二维码数据流
System.out.println(code);
ZxingUtils.writeToServletFile(code,servletResponse);
} else {
System.out.println("调用失败");
}
return "Success";
}
支付宝的二维码需要自己生成的,官方下载的Demo中也有Zxing的工具类(我改良了一下,主要是用于web页面显示二维码)
public static void writeToServletFile(String contents, HttpServletResponse resp){
try {
Map hints = new Hashtable();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
hints.put(EncodeHintType.CHARACTER_SET, "UTF8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE,
200, 200, hints);
MatrixToImageWriter.writeToStream(bitMatrix, "png", resp.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
这是Zxing所需要的 maven 依赖
com.google.zxing
core
3.3.3
com.google.zxing
javase
3.2.0
页面可以用img标签就可以接受我们转换的流文件(inputStream)
测试二维码生成
测试二维码生成
//这个地址是我通过花生壳转换过的域名
我们看一下页面展示效果
最后我们需要写一下支付成后以后的回调用地址(这里面有一个验签的过程提供很多种方法)
/**
* @Author : wangjian
* @Description 支付回掉URL
* @Date 2018/11/5 14:31
* @Param [licensePlateNumber]
* @Return java.lang.String
**/
@RequestMapping("/aliPayCallBack")
public String aliPayCallBack(HttpServletResponse response, HttpServletRequest request){
try {
Map params = new HashMap();
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);
}
boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.zfb_public_key, AlipayConfig.input_charset,"RSA2");
String trade_status = request.getParameter("trade_status"); // 交易状态
String order_no = request.getParameter("out_trade_no"); // 获取订单号
log.info("回调过程获取的订单编号:{}" ,order_no);
// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
if (flag==true) {// 验证成功
System.out.println("支付宝订单支付成功!");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("支付异常^-^");
}
return "";
}
最后还要稍微提一下,支付宝的沙箱测试(个人认为这也是比微信支付更牛逼的地方)
沙箱环境:在我理解看来就是一个模拟支付的流程(里面可以模拟各种支付)
1.需要下载对应的支付宝APP(文档上有二维码,当然目前只支持安卓手机下载)
2.下载好对应的APP以后,需要在支付宝开发里再次上传一下自己的公钥,然后获取支付宝对应的公钥,重新分配一个APPID,
支付宝网关同时也需要改(后面加了一个dev ),看好哟。
3.改完之后就可以随便测试了
好了,以上就是支付宝的扫码支付的全部流程了,完成了简单的支付流程,当然所有的代码都是撸在controller中,也没有连接
数据库,我是以一个小白的来自这件事情的,希望后续有人看了会对你有所帮助。