1、首先申请企业认证的支付帐户(如不是作公司项目,能够用我的的)算法
2、去支付宝开放平台申请网页移动端应用express
点击开发者中心,选择网页移动应用json
而后选择支付接入api
填写对应的信息,PC扫码支付针对的是电脑端,因此我在此选择网页应用。注意网址的URL填写的是项目在线上运行的网址。 服务器
而后确认建立,选择添加功能,因为该网站还作了H5网页,因此我选择了快捷手机支付,还有选择电脑支付app
而后勾选已经赞成,再去配置应用网关、受权回调地址、设置应用公钥(应用网关、受权回调地址是能够不配置的)post
如下是应用网关设置的截图网站
上传的公用字符就是该应用的应用公钥。在生成密钥时,也会生成应用私钥。咱们能够将私钥保存起来。后面支付接口会用到。编码
而后就能够提交去审核。审核以及签约经过,上线后就能够进行开发啦。url
3、开发环境配置
能够去支付宝开放平台进行下载 https://docs.open.alipay.com/194/106078
1AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
关键参数说明:
配置参数 |
示例值解释 |
获取方式/示例值 |
URL |
支付宝网关(固定) |
https://openapi.alipay.com/gateway.do |
APP_ID |
APPID 即建立应用后生成 |
|
APP_PRIVATE_KEY |
开发者应用私钥,由开发者本身生成 |
详见配置密钥 |
FORMAT |
参数返回格式,只支持 json 格式 |
json(固定) |
CHARSET |
请求和签名使用的字符编码格式,支持 GBK和 UTF-8 |
开发者根据实际工程编码配置 |
ALIPAY_PUBLIC_KEY |
支付宝公钥,由支付宝生成 |
详见配置密钥 |
SIGN_TYPE |
商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐商家使用 RSA2。 |
RSA2 |
环境 | HTTPS请求地址 |
---|---|
正式环境 | https://openapi.alipay.com/gateway.do |
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
app_id | String | 是 | 32 | 支付宝分配给开发者的应用ID | 2014072300007148 |
method | String | 是 | 128 | 接口名称 | alipay.trade.pay |
format | String | 否 | 40 | 仅支持JSON | JSON |
charset | String | 是 | 10 | 请求使用的编码格式,如utf-8,gbk,gb2312等 | utf-8 |
sign_type | String | 是 | 10 | 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2 | RSA2 |
sign | String | 是 | 344 | 商户请求参数的签名串,详见签名 | 详见示例 |
timestamp | String | 是 | 19 | 发送请求的时间,格式"yyyy-MM-dd HH:mm:ss" | 2014-07-24 03:07:50 |
version | String | 是 | 3 | 调用的接口版本,固定为:1.0 | 1.0 |
notify_url | String | 否 | 256 | 支付宝服务器主动通知商户服务器里指定的页面http/https路径。 | http://api.test.alipay.net/atinterface/receive_notify.htm |
app_auth_token | String | 否 | 40 | 详见应用受权概述 | |
biz_content | String | 是 | 请求参数的集合,最大长度不限,除公共参数外全部请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档 |
具体参数去看支付宝官方文档 https://docs.open.alipay.com/api_1/alipay.trade.pay
接下来,开发者就能够用 alipayClient 来调用具体的 API 了。alipayClient 只须要初始化一次,后续调用不一样的 API 均可以使用同一个 alipayClient 对象。
在application.yml封装属性
@Value("${app.ali-pay-appId}") private String APP_ID; /** * 应用私钥 */ @Value("${app.ali-pay-merchantPrivateSign}") private String APP_PRIVATE_KEY; /** * 支付宝公钥 */ @Value("${app.ali-pay-aliPublicSign}") private String ALIPAY_PUBLIC_KEY; /** * 回调地址 */ @Value("${app.ali-pay-notifyUrl}") private String notify_url; /** * 签名类型 */ @Value("${app.ali-pay-signType}") private String SIGN_TYPE; /** * 编码集 */ @Value("${app.ali-pay-charset}") private String CHARSET; /** * 支付宝网关 */ @Value("${app.ali-pay-payGateWay}") private String URL; @Value("${app.order-pay-switch}") private String flag;
统一下单接口
//实例化阿里支付 AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); //建立api对应的request AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setNotifyUrl(notify_url); //先生成一个随机数当订单号,后续修改正式使用的 String outTradeNo = "" + System.currentTimeMillis(); Map<String,Object> maps = new HashMap<>(); maps.put("out_trade_no",outTradeNo); maps.put("total_amount","0.01"); maps.put("product_code","FAST_INSTANT_TRADE_PAY"); //产品名后续修改 maps.put("subject", "Iphone6 16G"); maps.put("timeout_express","3m"); String postData = JSONObject.toJSONString(maps); alipayRequest.setBizContent(postData); logger.info("requestId:{},function:{},request:{}",requestId,"支付宝支付请求参数",postData); //AlipayTradePagePayResponse response = alipayClient.execute(alipayRequest); String form = alipayClient.pageExecute(alipayRequest).getBody(); logger.info("requestId:{},function:{},response:{}" , requestId , "aliPay" , form); logger.info("requestId:{},userId:{},function:{}",requestId,userIds,"发起支付宝支付请求");
//支付宝回调 @PostMapping(value = "/ali") @SkipUserAuth public String notify(HttpServletRequest request){ Map requestParams = request.getParameterMap(); String q = ""; for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); for (int i = 0; i < values.length; i++) { q+=name+"="+values[i]+"&"; } } System.out.println("支付宝支付结果通知"+requestParams.toString()); logger.info("requestId:{},function:{},response:{}",requestId,"支付宝支付结果通知",q); //获取支付宝POST过来反馈信息 Map<String,String> params = new HashMap<String,String>(); 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); } logger.info("requestId:{},function:{},response:{}", requestId , "支付宝回调" , params.toString()); //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type) try { //验证签名 boolean flag = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET,SIGN_TYPE); logger.info("requestId:{},function:{},response:{}", requestId, "支付宝回调验证签名", flag); if(flag){ if("TRADE_SUCCESS".equals(params.get("trade_status"))){ //商户订单号 String out_trade_no = params.get("out_trade_no"); logger.info("打印支付宝回调数据" + out_trade_no); //下面省略修改订单逻辑 } } } catch (AlipayApiException e) { e.printStackTrace(); logger.info("requestId:{} err",request ,e); logger.error("requestId:{} err",request ,e); } return "success"; }
以上就是统一下单接口的方法和验证签名的方法