1 登录开放平台 搜索 沙箱
这里可以配置 异步回调/同步回调网址,已经选择接口加签方式,做测试可使用默认的秘钥,
选择公钥模式即可,也可尝试下载秘钥生成工具。
秘钥生成工具:小程序文档 - 支付宝文档中心
2 在搜索框搜 索秘钥工具
选择一篇文档点入
根据自己需求下载相应客户端,***安装在纯英文路径下***
安装完成后打开客户端,点击生成私钥
然后,用自己的 公钥 去沙箱的: 沙箱应用——自定义私钥 位置 换取 支付宝的 公钥
注意:将自己的公私钥和 支付宝的公钥 用一个 TXT 文件保存一下,待会要用
3 前端准备一个请求调用 后端接口 生成待支付页面 前期准备大概就这样,接下来准备后端代码:
3.1:在application.yaml中配置 对接需要的参数,之前打开的页面就有,先保存到TXT文档,再复制过来,防止格式错误 。 ***务必注意区分网关,防止出现APPID报错***
# 配置alipay数据
alipay:
# 您的APPID,收款账号就是您APPID对应的支付宝账号
APPID:
# 商户私钥,您的PKCS8格式RSA2私钥
RSA_PRIVATE_KEY: "商户私钥"
# 支付宝支付公钥
ALIPAY_PUBLIC_KEY: "支付宝支付公钥"
# 异步回调地址 必须外网能够访问(这里需要配置内网穿透),当支付成功后会调用该API
notify_url:
# 同步回调地址 必须外网能够访问
return_url:
# 网关(注意沙箱网关和正式网关的区别,这里填写沙箱环境下的网关)
URL: https://openapi-sandbox.dl.alipaydev.com/gateway.do
# 编码
CHARSET: UTF-8
# 返回数据格式
FORMAT: json
# 日志地址
log_path: /log
# RSA2
SIGNTYPE: RSA2
3.2 准备一个配置类读取配置参数,后边业务层实现类需要调用,也方便后期维护
package com.jd.basic.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @Author: xiyang
* @FileName: AlipayConfig
* @Date: Created in 2021/8/5 10:32
* @Vserion:
* @Description: TODO
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Component
public class AlipayConfig {
/**
* 商户appid
*/
@Value("${alipay.APPID}")
public String APPID;
/**
* 私钥 pkcs8格式的
*/
@Value("${alipay.RSA_PRIVATE_KEY}")
public String RSA_PRIVATE_KEY;
/**
* 服务器异步通知页面路径
* 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
*/
@Value("${alipay.notify_url}")
public String notify_url;
/**
* 页面跳转同步通知页面路径
* 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,
* 必须外网可以正常访问 商户可以自定义同步跳转地址
*/
@Value("${alipay.return_url}")
public String return_url;
/**
* 请求网关地址
*/
@Value("${alipay.URL}")
public String URL;
/**
* 编码
*/
@Value("${alipay.CHARSET}")
public String CHARSET;
/**
* 返回格式
*/
@Value("${alipay.FORMAT}")
public String FORMAT;
/**
* 支付宝公钥
*/
@Value("${alipay.ALIPAY_PUBLIC_KEY}")
public String ALIPAY_PUBLIC_KEY;
/**
* 日志记录目录定义在 logFile 中
*/
@Value("${alipay.log_path}")
public String log_path;
/**
* RSA2
*/
@Value("${alipay.SIGNTYPE}")
public String SIGNTYPE;
}
3.3 controller层接口自行准备 ,这里只提供业务层连接代码, 传入的参数和返回参数根据自己业务调整。
注意:***我这里返回的AjaxResult只是装数据用的数据传输类 实际有效的是下边这段代码中的response 对象,里边含有 支付宝提供的 form待支付表单,需要在前端将这个待支付表单取出并展示
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
@Override
public AjaxResult alipay(PayDto payDto) {
/**
* 1. 获取阿里客户端
* 2. 获取阿里请求对象
* 3. 设置请求参数
* 4. 设置同步通知回调路径
* 5. 设置异步通知回调路径
*/
try {
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getURL(), alipayConfig.getAPPID(), alipayConfig.getRSA_PRIVATE_KEY(), "json", "utf-8", alipayConfig.getALIPAY_PUBLIC_KEY(), "RSA2");
System.out.println(alipayConfig.getAPPID());
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
//异步接收地址,仅支持http/https,公网可访问
request.setNotifyUrl(alipayConfig.getNotify_url());
//同步跳转地址,仅支持http/https
request.setReturnUrl(alipayConfig.getReturn_url());
/******必传参数******/
JSONObject bizContent = new JSONObject();
//商户订单号,商家自定义,保持唯一性
bizContent.put("out_trade_no", "6465465465465");
//支付金额,最小值0.01元
bizContent.put("total_amount", 0.01);
//订单标题,不可使用特殊符号
bizContent.put("subject", "测试商品");
//电脑网站支付场景固定传值FAST_INSTANT_TRADE_PAY
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
/******可选参数******/
//bizContent.put("time_expire", "2022-08-01 22:00:00");
商品明细信息,按需传入
//JSONArray goodsDetail = new JSONArray();
//JSONObject goods1 = new JSONObject();
//goods1.put("goods_id", "goodsNo1");
//goods1.put("goods_name", "子商品1");
//goods1.put("quantity", 1);
//goods1.put("price", 0.01);
//goodsDetail.add(goods1);
//bizContent.put("goods_detail", goodsDetail);
扩展信息,按需传入
//JSONObject extendParams = new JSONObject();
//extendParams.put("sys_service_provider_id", "2088511833207846");
//bizContent.put("extend_params", extendParams);
request.setBizContent(bizContent.toString());
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
System.out.println("调用成功");
return AjaxResult.success(response);
} else {
System.out.println("调用失败");
return AjaxResult.error("系统繁忙");
}
} catch (AlipayApiException e) {
throw new RuntimeException(e);
}
}
4 前端解析后端响应的待支付表单
这里提供两种解决方案:
4.1 准备一个div 双标签,添加一个id属性mydiv,用这段代码解析:$("#mydiv").html(res.data.resultObj.body);
4.2 直接用 document.write(res.data.resultObj.body); 完成解析即可展示待支付界面