Java接入支付宝沙箱支付图文详细教程 2021

使用springboot接入支付宝沙箱支付

1. 首先进入到支付宝的官网

2.  这里直接用自己的支付宝扫码登陆即可,进入后选我是开发者,填写一些相关信息,这里就不做赘述了

3. 进来后,往下翻,看到如下图的红箭头,点进去

 4. OK,到这里来看下页面上的内容

 

 

5. 使用支付宝的密钥工具获取密钥

小程序文档 - 支付宝文档中心

 以前需要下载密钥工具,现在支付宝有一个在线生成密钥的网站,真的非常便捷!

 进来后按照默认的就好了,不用改动

然后点击生成密钥

回到这个页面,选择自定义密钥

 将刚刚生成的密钥复制过来

 保存后如图所示

支付宝相关的准备工作做完后,准备来搭建springboot项目,这里自行完成哦


相关依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <!--支付宝sdk-->
        <!-- alipay -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

 目录一览

AliBean

public class AliBean {
    /**
     * 商户订单号,必填
     */
    private String out_trade_no;
    /**
     * 订单名称,必填
     */
    private String subject;
    /**
     * 付款金额,必填
     * 根据支付宝接口协议,必须使用下划线
     */
    private String total_amount;
    /**
     * 商品描述,可空
     */
    private String body;
    /**
     * 超时时间参数
     */
    private String timeout_express = "1h";
    /**
     * 产品编号
     */
    private String product_code = "FAST_INSTANT_TRADE_PAY";

    public String getOut_trade_no() {
        return out_trade_no;
    }

    public void setOut_trade_no(String out_trade_no) {
        this.out_trade_no = out_trade_no;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getTotal_amount() {
        return total_amount;
    }

    public void setTotal_amount(String total_amount) {
        this.total_amount = total_amount;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getTimeout_express() {
        return timeout_express;
    }

    public void setTimeout_express(String timeout_express) {
        this.timeout_express = timeout_express;
    }

    public String getProduct_code() {
        return product_code;
    }

    public void setProduct_code(String product_code) {
        this.product_code = product_code;
    }
}

 PropertiesListener

@Component
public class PropertiesListener implements ApplicationListener<ApplicationStartedEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        AliPayProperties.loadProperties();
    }
}

OrderController

@RestController
@RequestMapping("order")
public class OrderController {

    @Autowired
    private PayService payService;

    @PostMapping(value = "alipay")
    public String alipay(String outTradeNo, String subject, String totalAmount, String body) throws AlipayApiException {
        AliBean alipayBean = new AliBean();
        alipayBean.setOut_trade_no(outTradeNo);
        alipayBean.setSubject(subject);
        alipayBean.setTotal_amount(totalAmount);
        alipayBean.setBody(body);
        return payService.aliPay(alipayBean);
    }
}

AliPay

@Component
public class AliPay {
    /**
     * 支付接口
     * @param alipayBean
     * @return
     * @throws AlipayApiException
     */
    public String pay(AliBean alipayBean) throws AlipayApiException {
        // 1、获得初始化的AlipayClient
        String serverUrl = AliPayProperties.getGatewayUrl();
        String appId = AliPayProperties.getAppId();
        String privateKey = AliPayProperties.getPrivateKey();
        String format = "json";
        String charset = AliPayProperties.getCharset();
        String alipayPublicKey = AliPayProperties.getPublicKey();
        String signType = AliPayProperties.getSignType();
        String returnUrl = AliPayProperties.getReturnUrl();
        String notifyUrl = AliPayProperties.getNotifyUrl();
        AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
        // 2、设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        // 页面跳转同步通知页面路径
        alipayRequest.setReturnUrl(returnUrl);
        // 服务器异步通知页面路径
        alipayRequest.setNotifyUrl(notifyUrl);
        // 封装参数
        alipayRequest.setBizContent(JSON.toJSONString(alipayBean));
        // 3、请求支付宝进行付款,并获取支付结果
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        System.out.println(result);
        // 返回付款信息
        return result;
    }
}

AliPayProperties

@Component
public class AliPayProperties {
    public static final String APP_ID = "appId";
    public static final String PRIVARY_KEY = "privateKey";
    public static final String PUBLIC_KEY = "publicKey";
    public static final String NOTIFY_URL = "notifyUrl";
    public static final String RETURN_URL = "returnUrl";
    public static final String SIGN_TYPE = "signType";
    public static final String CHARSET = "charset";
    public static final String GATEWAY_URL = "gatewayUrl";
    public static final String LOG_PATH = "logPath";

    /**
     * 保存加载配置参数
     */
    private static Map<String, String> propertiesMap = new HashMap<String, String>();

    /**
     * 加载属性
     */
    public static void loadProperties() {
        // 获得PathMatchingResourcePatternResolver对象
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            // 加载resource文件(也可以加载resources)
            Resource resources = resolver.getResource("classpath:alipay.properties");
            PropertiesFactoryBean config = new PropertiesFactoryBean();
            config.setLocation(resources);
            config.afterPropertiesSet();
            Properties prop = config.getObject();
            // 循环遍历所有得键值对并且存入集合
            for (String key : prop.stringPropertyNames()) {
                propertiesMap.put(key, (String) prop.get(key));
            }
        } catch (Exception e) {
            new Exception("配置文件加载失败");
        }
    }

    /**
     * 获取配置参数值
     * @param key
     * @return
     */
    public static String getKey(String key) {
        return propertiesMap.get(key);
    }

    public static String getAppId() {
        return propertiesMap.get(APP_ID);
    }

    public static String getPrivateKey() {
        return propertiesMap.get(PRIVARY_KEY);
    }

    public static String getPublicKey() {
        return propertiesMap.get(PUBLIC_KEY);
    }

    public static String getNotifyUrl() {
        return propertiesMap.get(NOTIFY_URL);
    }

    public static String getReturnUrl() {
        return propertiesMap.get(RETURN_URL);
    }

    public static String getSignType() {
        return propertiesMap.get(SIGN_TYPE);
    }

    public static String getCharset() {
        return propertiesMap.get(CHARSET);
    }

    public static String getGatewayUrl() {
        return propertiesMap.get(GATEWAY_URL);
    }

    public static String getLogPath() {
        return propertiesMap.get(LOG_PATH);
    }
}

PayServiceImpl

@Service
public class PayServiceImpl implements PayService {

    @Autowired
    private AliPay aliPay;

    @Override
    public String aliPay(AliBean alipayBean) throws AlipayApiException {
        System.out.println(alipayBean.toString());
        return aliPay.pay(alipayBean);
    }
}

PayService

public interface PayService {

    String aliPay(AliBean alipayBean) throws AlipayApiException;

}

AliPay.properties

# 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
appId: 2021000118637403
# 商户私钥,您的PKCS8格式RSA2私钥
privateKey: 填自己刚刚生成的
# 支付宝公钥,查看地址:https://openhome.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
publicKey: 填自己刚刚生成的
# 服务器异步通知页面路径需http://格式的完整路径,不能加?id=123这类自定义参数
notifyUrl: http://localhost:9090/error.html
# 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数
# 9uhun6ik.dongtaiyuming.net:57459
# 买家账号密码 htlmqf5154@sandbox.com
returnUrl: http://IP:端口/success.html
# 签名方式
signType: RSA2
# 字符编码格式
charset: utf-8
# 支付宝网关
gatewayUrl: https://openapi.alipaydev.com/gateway.do
# 支付宝日志
logPath: "D:\\"

页面可以自己自定义,但是要注意的是,里面的name值不要乱写,都是对应着的,例如:

看不清可以放大一下哈,这几个参数是必须的


 上面的弄完后,说一下这个沙箱版支付宝APP怎么弄,下载完成后打开,选择下方的邮箱登陆,我就不贴图了,那么这个账号在哪找呢?

 用这个来登陆沙箱支付宝,我那天看到有人还在吐槽支付宝laji,说这个沙箱版支付宝用手机号或者淘宝登录,登陆不上去,我寻思着他可能没理解什么是沙箱版支付宝。。。。。。。


上面的都做完后,可以来小小的测试一下 (ps: 那个订单支付界面,就写几个输入框,一个按钮就行,然后注意上面说的,那个name值不要乱写,这个是要传给后台的)

这里可以使用扫码支付,也可以使用账号密码支付

另外提一句,那个支付过期时间自己是可以改动的,细心的小伙伴可能已经发现了,对,就在实体类里面,找到timeout_express

 

 分:m

小时:h

如果想表示90分钟呢? 90m


 这里还有个小疑问,那就是回调地址有了,那是谁发起的请求呢?答案当然是支付宝,但是如果填本地  localhost:9090/success.html 你说这样能请求到吗?很显然不能,因为这个地址是我们本地的,那么如果才能让支付宝请求到我们本地的地址呢?

这里给大家介绍一下内网穿透

内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。下面就相互通信的主机在网络中与 NAT 设备的相对位置介绍内网穿透方法。 [1]

UDP 内网穿透的实质是利用路由器上的NAT 系统。NAT 是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。NAT可以完成重用地址,并且对于内部的网络结构可以实现对外隐蔽。

 这里我使用网云穿,当然也有很多免费好用的,比如natapp,樱花,花生壳等等

百度搜网云穿即可,然后注册一波,去下载客户端

 

 下载完客户端后点击启动,然后运行自己本地的项目即可,注意端口要对的上。然后用分配给的域名去进行访问就OK了。


至此,沙箱支付宝整合以及网云穿的基本使用教程就完成了,有写的不好的地方,欢迎各位小伙伴在评论区指导,批评,有什么问题可以在下方评论或者私信我。

如果成功运行,记得给我点个赞哦,写作不易,抱拳了!

### Java 环境下支付宝沙箱测试配置教程 #### 配置前准备 为了确保Java环境下能够顺利进行支付宝沙箱测试,需先完成一系列准备工作。这包括注册并登录至支付宝开放平台,创建应用以及获取必要的API密钥等信息[^1]。 #### 创建与配置沙箱环境 通过访问支付宝开放平台网站,并依照指引进入开发者模式下的沙箱环境中设置相应的应用程序参数。在此过程中需要注意区分正式生产环境同测试环境间URL的不同之处以免造成诸如`appid错误`之类的配置失误问题[^2]。 #### 下载Demo项目并调整适应本地开发条件 从官方提供的资源库中选取适合当前使用的版本作为基础框架来构建自己的支付集成方案;对于SSM架构而言,则应特别关注如何有效地将两种主流移动支付方式即微信支付支付宝支付整合进来以满足业务逻辑的需求[^3]。 #### 修改代码适配沙箱特性 针对所选编程语言编写具体实现细节时,应当充分考虑到实际运行时可能会遇到的各种情况作出相应处理措施。例如,在Java程序里可以采用如下所示的方式定义服务端接口用于发起交易请求: ```java // 定义一个方法用来调用支付宝沙箱支付接口 public String alipayTradePagePay(String out_trade_no, BigDecimal total_amount){ // 构建公共请求参数对象 AlipayClient client = new DefaultAlipayClient( "https://openapi.alipaydev.com/gateway.do", // 测试网关地址 app_id, merchant_private_key, "json", charset, alipay_public_key, sign_type); // 设置业务参数 AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); JSONObject bizContent = new JSONObject(); bizContent.put("out_trade_no", out_trade_no); bizContent.put("total_amount", total_amount.toString()); bizContent.put("subject", "Test Subject"); request.setBizContent(bizContent.toJSONString()); try { // 发起同步HTTP POST请求 return client.pageExecute(request).getBody(); } catch (AlipayApiException e) { throw new RuntimeException(e.getMessage(),e); } } ``` 上述示例展示了怎样利用阿里巴巴提供的SDK封装好的类快速搭建起一套完整的在线付款流程原型系统以便于后续调试优化工作开展[^4]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值