支付宝h5支付(java版)(2)

简介: 支付宝h5支付(java版)

2、代码开发

2.1 引入java sdk包
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.7.26.ALL</version>
</dependency>
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
</dependency>


2.2 开发配置类
package com.shop.constants;
/**
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *修改日期:2019-04-30
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 
 */
public class AlipayConfig {
  //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    public static String app_id = "20160******";
    // 商户私钥,您的PKCS8格式RSA2私钥
    public static String merchant_private_key = "*******";
    // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "********";
    // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String notify_url = "https://www.alipay.com";
    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,沙箱环境下可以填写本地地址
    public static String return_url = "http://localhost:8082/web/pay/callback";
    // 签名方式
    public static String sign_type = "RSA2";
    // 字符编码格式
    public static String charset = "utf-8";
    // 支付宝网关
    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
//销售产品码,商家和支付宝签约的产品码,默认值为:QUICK_WAP_WAY
    public static String productCode ="QUICK_WAP_WAY";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
}
2.3 开发工具类

参数详情请看这里:https://docs.open.alipay.com/204/105301/

import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.shop.constants.AlipayConfig;
import com.shop.constants.BakConstants;
public class PayUtil {
  /**
   * @Title: alipay   
   * @Description: TODO(支付)   
   * @param outTradeNo  商户订单号,商户网站订单系统中唯一订单号,必填   对应缴费记录的orderNo
     * @param totalAmount  付款金额,必填
     * @param subject 主题
     * @param body 商品描述,可空
   * @param: @return
   * @param: @throws Exception      
   * @return: String      
   * @throws
   */
    public static String alipay(String outTradeNo,String totalAmount,String subject,String body) throws Exception{
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, 
            AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, 
            AlipayConfig.sign_type);
        //该笔订单允许的最晚付款时间
        String timeout=30m;
        //设置请求参数
        String content = "{\"out_trade_no\":\""+ outTradeNo +"\"," 
                + "\"total_amount\":\""+ totalAmount +"\"," 
                + "\"subject\":\""+ subject +"\"," 
                + "\"timeout_express\":\""+ timeout +"\"," 
                + "\"body\":\""+ body +"\"," 
                + "\"product_code\":\""+AlipayConfig.productCode+"\"}";
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
        alipayRequest.setBizContent(content);                                                                                                                                                               
        //请求
        String result="";
        result = alipayClient.pageExecute(alipayRequest).getBody();
        return result;
    }
    /**
     * 支付宝退款接口
     * @param outTradeNo
     * @param tradeNo
     * @param refundAmount
     * @param refundReason
     * @param out_request_no  标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
     * @return
     */
    public static String aliRefund(String outTradeNo,String tradeNo,String refundAmount,String refundReason,String out_request_no) {
        //获得初始化的AlipayClient
                AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
                //设置请求参数
                AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
                alipayRequest.setReturnUrl(AlipayConfig.return_url);
                alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
                try {               
                    alipayRequest.setBizContent("{\"out_trade_no\":\""+ outTradeNo +"\"," 
                            + "\"trade_no\":\""+ tradeNo +"\"," 
                            + "\"refund_amount\":\""+ refundAmount +"\"," 
                            + "\"refund_reason\":\""+ refundReason +"\"," 
                            + "\"out_request_no\":\""+ out_request_no +"\"}");                                                                                                                                                               
                //请求
                String result;
                //请求
                result = alipayClient.execute(alipayRequest).getBody();
                System.out.println("*********************\n返回结果为:"+result);
                return result;
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    return null;
                }
    }
    /**
     * 支付宝的验签方法
     * @param req
     * @return
     */
    public static boolean checkSign(HttpServletRequest req) {
        Map<String, String[]> requestMap = req.getParameterMap();
        Map<String, String> paramsMap = new HashMap<>();
        requestMap.forEach((key, values) -> {
              String strs = "";
              for(String value : values) {
              strs = strs + value;
              }
              System.out.println(("key值为"+key+"value为:"+strs));
              paramsMap.put(key, strs);
            });
        //调用SDK验证签名
        try {
            return  AlipaySignature.rsaCheckV1(paramsMap, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
        } catch (AlipayApiException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("*********************验签失败********************");
            return false;
        }
    }
}
2.4、此时,即可打开支付宝登录页面。在手机端访问可以打开支付宝客户端
2.5、回调方法和支付完成的返回方法。

回调的方法是在AlipayConfig 类下有个return_url 是该应用回调的地址

2.6、回调接收参数:
import java.math.BigDecimal;
public class AlipayNotifyParam {
  private String charset;//编码格式
  private String out_trade_no;//商户网站唯一订单号
  private String trade_no;//该交易在支付宝系统中的交易流水号。最长64位
  private String method;
  private BigDecimal total_amount;//该笔订单的资金总额
  private String sign;//签名结果
  private String auth_app_id;
  private String app_id;//支付宝分配给开发者的应用Id
  private String sign_type;//签名类型
  private String seller_id;//收款支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字
  private String timestamp;//时间
  //get和set省略
  }

3、沙箱环境

在开发中心-》研发服务-》沙箱

沙箱:https://docs.open.alipay.com/200/105311/

简单而言就是支付宝测试环境 ,有一个沙箱账号:买家账号和一个卖家账号,可以进行模拟支付

屏幕快照 2022-05-10 下午12.00.02.png屏幕快照 2022-05-10 上午11.59.57.png

最后做完一系列 订单操作。支付完成返回页可以是订单详情页。

目录
相关文章
|
6月前
|
JavaScript Java 测试技术
基于Java的金融支付终端管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的金融支付终端管理系统的设计与实现(源码+lw+部署文档+讲解等)
64 1
|
3月前
|
Java API Spring
打造未来电商新引擎:揭秘Java可扩展API设计,让支付与物流灵活如丝,引领电商时代潮流!
【8月更文挑战第30天】本文通过电商平台案例,探讨了如何设计可扩展的Java API。首先定义支付和物流服务的接口与抽象类,然后实现具体服务,接着引入工厂模式或依赖注入管理服务实例,最后通过配置实现灵活扩展。这种设计确保了应用架构的灵活性和长期稳定性。
55 3
|
3月前
|
Java 数据库连接 缓存
Hibernate性能调优:五大秘籍,让应用效能飙升,告别慢如蜗牛的加载,体验丝滑般流畅!
【8月更文挑战第31天】本文深入探讨了提升Hibernate应用性能的五大技巧,包括选择合适的缓存策略、优化查询语句、合理使用Eager与Lazy加载、批量操作与事务管理以及利用索引和数据库优化。通过正确配置多级缓存、分页查询、延迟加载、批量处理及合理创建索引,能够显著提高应用响应速度与吞吐量,改善用户体验。这些技巧需根据具体应用场景灵活调整,以实现最佳性能优化效果。
167 0
|
5月前
|
JSON Java 数据安全/隐私保护
一篇文章讲明白Java第三方支付接入案例(支付宝)
一篇文章讲明白Java第三方支付接入案例(支付宝)
265 0
|
5月前
|
前端开发 小程序 Java
(JAVA)获取支付宝二维码 带参数
(JAVA)获取支付宝二维码 带参数
|
5月前
|
小程序 前端开发 Java
(JAVA)支付宝小程序登录相关(authToken获取用户唯一userId、encryptedData解密手机号)
(JAVA)支付宝小程序登录相关(authToken获取用户唯一userId、encryptedData解密手机号)
420 0
|
10天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
19天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
6天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
25 9
|
9天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####