主流程如下:
1、建支付宝账号
2、申请权限功能(APP支付、开发权限等)
3、用阿里给的工具生成密钥和证书,并且上传到阿里,然后他会生成三个文件(支付宝公钥、ROOTCERT、公钥证书)
4、最后就是代码(这里也用阿里封装好的代码,加签解签)
1、创建企业用户且登录
https://auth.alipay.com/login/index.htm
2、选择你想要开发的功能(比如APP支付)
3、这里会有相应的文档
https://b.alipay.com/signing/productDetailV2.htm?productId=I1011000290000001002
这里主要看接入指引和申请条件
参考一下申请条件,看看自己是否符合。一般都没啥问题
1)然后点击”立即接入" 企业证书什么的填写好,经过审批(大概一个工作日)
2)入驻成为开发者——又是一系列傻瓜操作
3)基本进入开发
4、开发流程
创建APPID——配置密钥——开发(加签、验签)
第一次做,总会有点迷糊,这里最麻烦就是配置密钥
https://open.alipay.com/platform/keyManage.htm
这是主要是配置接口加签方式,点击加签方式(我这里已经配置好了,所以有一些不一样)
流程是,下载支付宝提供的密钥(证书)软件——生成密钥——上传生成好的密钥文件——下载支付宝公钥、RootCert、自己的公钥证书,操作如下:
1)点击查看接口文档
https://docs.open.alipay.com/291/105971#Krqvg
其实文档说得很明白了,我这里简单说明
密钥长度选择RSA2(更安全)
密钥格式PKCS8(JAVA适用)
点击生成密钥
点击获取CSR文件 (点击后在硬盘将生成csr文件和两个密钥,csr用于上传到支付宝)
点击打开文件位置,查看自己生成的文件
5、回到网站配置密钥
选择公钥证书——上传刚刚生成的CSR文件
此时,这里有三个下载证书连接,全部下载下来,放到硬盘中,开发需要用到
6、进入代码开发
https://docs.open.alipay.com/204/105297/ 快速接入文档
我们可以看到流程,按照一个电商平台的流程,我理解如下
1、用户选择好商品后,提交
2、服务端生成订单返回(这里还没关联到支付宝)
3、用户选择支付方式(这里选支付宝),点击支付按钮(发送订单信息到服务器)
4、将订单生成支付需要的信息(拼参数,加密,加签),返回到前端
5、前端调支付宝封装好的接口,将参数传递(这时候会跳转到支付宝支付界面,后面用户在支付宝支付后就完事儿了)
6、支付宝返回到用户界面。
7、同时后台会异步收到交易信息
8、有时候,我们也会发起查询,主动获取支付状态
后台代码操作如下:
点击 开放平台服务端DEMO&SDK
点击MAVEN项目依赖,这个JAR包里,可以用到支付宝提供的加签解签接口。相当方便
配置在pom.xml项目中
com.alipay.sdk
alipay-sdk-java
4.9.13.ALL
这里我们先做支付接口(支付宝提供了两种方式,一种不用证书,一种用证书方式。我们肯定是需要用证书的)
刚刚进入的网页,拉到下边,就是证书的DEMO
我的参考代码如下
private AlipayClient constractCertAlipayClient() throws AlipayApiException {
//构造client
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
//设置网关地址
certAlipayRequest.setServerUrl(ServerUrl);
//设置应用Id
certAlipayRequest.setAppId(appid);
//设置应用私钥
certAlipayRequest.setPrivateKey(appprivatekey);
//设置请求格式,固定值json
certAlipayRequest.setFormat(format);
//设置字符集
certAlipayRequest.setCharset(charset);
//设置签名类型
certAlipayRequest.setSignType(signType);
//设置应用公钥证书路径
certAlipayRequest.setCertPath(certpath);
//设置支付宝公钥证书路径
certAlipayRequest.setAlipayPublicCertPath(alipaypubliccertpath);
//设置支付宝根证书路径
certAlipayRequest.setRootCertPath(rootcertpath);
//构造client
return new DefaultAlipayClient(certAlipayRequest);
}
@Override
public String paymentWithApp(Orders orders) throws AlipayApiException {
String returnStr = null;
AlipayClient alipayClient = this.constractCertAlipayClient();
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody(orders.getDescription());
model.setSubject(orders.getDescription());
model.setOutTradeNo(String.valueOf(orders.getId()));
model.setTimeoutExpress(timeoutExpress);
model.setTotalAmount(String.valueOf(orders.getAmount()));
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl(otifyUrl);
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
returnStr = response.getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
return returnStr;
}
这里主要就是把刚刚的证书,传给支付宝,调用他们提供的接口,就会自动加签。接口返回的字符串可以直接返回给前端
otifyUrl是支付保返回时候,你接收的地方接口
/**
* 把request转为map
*
* @param request
* @return
*/
private Map getParameterMap(HttpServletRequest request) {
// 参数Map
//获取支付宝POST过来反馈信息
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);
}
return params;
}
@Override
public Map callBack(HttpServletRequest request) throws AlipayApiException {
Map paramMap = this.getParameterMap(request);
log.info("请求回调 ========> " + JSONObject.toJSON(paramMap).toString());
boolean signVerified = AlipaySignature.rsaCertCheckV1(paramMap, alipaypubliccertpath, charset, "RSA2");//调用SDK验证签名
if(signVerified) {
return paramMap;
} else {
return null;
}
}
AlipaySignature.rsaCertCheckV1 这个阿里提供的解签,调用一下,就搞定了。整个流程基本如些
查询接口参考如下:
@Override
public String queryOrder(String orgOrderId, Integer orderId) throws AlipayApiException {
//构造client
AlipayClient alipayClient = this.constractCertAlipayClient();
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();//创建API对应的request类
JSONObject jsonObject = new JSONObject();
jsonObject.put("out_trade_no", orderId);
jsonObject.put("trade_no", orgOrderId);
request.setBizContent(jsonObject.toJSONString());
AlipayTradeQueryResponse response = alipayClient.certificateExecute(request);//通过alipayClient调用API,获得对应的response类
System.out.print(response.getBody());
log.info("查询返回信息 ========> " + response.getBody());
String returnStr = response.getBody();
return returnStr;
}
退款接口参考如下:
@Override
public Boolean refundOrder(String orgOrderId, Integer orderId, BigDecimal refundAmount) throws AlipayApiException {
AlipayClient alipayClient = this.constractCertAlipayClient();
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
JSONObject jsonObject = new JSONObject();
jsonObject.put("out_trade_no", String.valueOf(orderId));
jsonObject.put("trade_no", orgOrderId);
jsonObject.put("refund_amount", String.format("%.2f", refundAmount.doubleValue()));
request.setBizContent(jsonObject.toJSONString());
AlipayTradeRefundResponse response = alipayClient.certificateExecute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
return true;
}
(大家看这几个接口,他们的request分别如下:AlipayTradeAppPayRequest 、AlipayTradeQueryRequest 、AlipayTradeRefundRequest 。阿里就是从这个传弟的参数,判断调用的接口)
其它接口大致如上,我们可以点击
https://docs.open.alipay.com/204/105303/
去开发自己需要接口去吧,孩子们!