支付宝开放平台_沙箱环境_第三方 API _SpringBoot



一、支付宝接口

1-1】官网设置配置信息

未登录 —— 百度【支付宝开放平台】-【支付宝开发者中心】-【沙箱查看官方提示文档

  1. 登录【支付宝开放平台】-【开发者中心】-【研发服务】 / 【沙箱当面付接入引导】是官方文档

  2. 在这里插入图片描述


  1. 在这里插入图片描述

  1. 在这里插入图片描述

  1. 在这里插入图片描述

  1. 在这里插入图片描述

1-2】创建项目

官方案例 下载 Java 代码案例 和 Maven 依赖。根据博文来亦可

   1/3  依赖

<!---->
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.7.110.ALL</version>
</dependency>

   2/3  官方 - 原配置文件

package com.alipay.config;

import java.io.FileWriter;
import java.io.IOException;

/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *修改日期:2017-04-05
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */

public class AlipayConfig {
	
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

	// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
	// 【博主补充】开发者中心控制台 - 研发服务 - 沙箱应用
	public static String app_id = "";
	
	// 商户私钥,您的PKCS8格式RSA2私钥
	// 【博主补充】从支付宝开放平台助力( 下载用于生成私钥的软件 ) 中取
    public static String merchant_private_key = "";
	
	// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
	// 【博主补充】开发者中心控制台 - 研发服务 - 沙箱应用 - 【RSA2(SHA256)密钥(推荐)】中取
    public static String alipay_public_key = "";

	// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
	//【博主补充】 此路径暂未配置
	public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";

	// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
	// 【博主补充】http://localhost/breakInfo
	public static String return_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";

	// 签名方式
	public static String sign_type = "RSA2";
	
	// 字符编码格式
	public static String charset = "utf-8";
	
	// 支付宝网关
	// 【博主补充:沙箱环境网关】https://openapi.alipaydev.com/gateway.do
	public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
	
	// 支付宝网关
    // 【博主补充】官方原文件,此时应该为 log 日志存储
	public static String log_path = "C:\\";

	//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    /** 
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * @param sWord 要写入日志里的文本内容
     */
    public static void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
            writer.write(sWord);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

   3/3  Controller 层

package com.debj.day20200618_ali_zfb_api.controller;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.debj.day20200618_ali_zfb_api.config.AlipayConfig;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

@Controller
public class PayController {

    @ResponseBody
    @RequestMapping(value = "/pay")
    public void aliPay(
            @RequestParam Map map,
            HttpServletRequest request,
            HttpServletResponse response) throws AlipayApiException, IOException {

        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        //商户订单号,商户网站订单系统中唯一订单号,必填
        // String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
        String out_trade_no = (String) map.get("WIDout_trade_no");
        
        //付款金额,必填
        //String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8");
        String total_amount = (String) map.get("WIDtotal_amount");
        
        //订单名称,必填
        //String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8");
        String subject = (String) map.get("WIDsubject");
        
        //商品描述,可空
        //String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8");
        String body = (String) map.get("WIDbody");

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                + "\"total_amount\":\""+ total_amount +"\","
                + "\"subject\":\""+ subject +"\","
                + "\"body\":\""+ body +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        //若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明
        //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
        //		+ "\"total_amount\":\""+ total_amount +"\","
        //		+ "\"subject\":\""+ subject +"\","
        //		+ "\"body\":\""+ body +"\","
        //		+ "\"timeout_express\":\"10m\","
        //		+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节

        //请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();

        //输出
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println(result);
        out.flush();
        out.close();
    }

    @ResponseBody
    @RequestMapping(value = "/breakInfo")
    public String breakInfo(){
        return "支付宝返回界面,注意 url 参数,附带了此次交易信息";
    }
}

1-3】测试 及 Bug 排除

  yml 仅配置了一个 端口:80
  SpringBoot 仅有一个 spring-boot-starter-web 依赖

// 每次请求时需要将 订单编号修改
http://127.0.0.1/pay?WIDout_trade_no=asdfasdfwfadfw&WIDtotal_amount=100&WIDsubject=apple&WIDbody=OneApple
  • 浏览器显示 h5 代码字符
    • bug 描述:请求发送后,页面显示 h5 代码字符。
    • but 解决:response.setContentType("text/html;charset=utf-8");

  • 遇到防钓鱼执法
    • bug 描述:项目没有报错!浏览器没有异常。只是跳转到钩鱼执法页面
    • bug 分析:分析不出来
    • bug 解决 01:我将选看的参数皆配置上去了,启动项目,依旧遇到钓鱼执法 —— 尝试失败在这里插入图片描述
    • bug 解决 02:从【谷歌浏览器】切换至【火狐浏览器】 —— 尝试成功
    • bug 解决 03:重启【谷歌浏览器】 —— 尝试成功
    • 总结:暂无

猜你喜欢

转载自blog.csdn.net/ice_debj/article/details/106836966