支付宝沙箱支付 内网穿透 boot整合支付
支付宝沙箱 操作指引:沙箱环境 - 支付宝文档中心 (alipay.com)
进入沙箱, 需要 使用 实名认证的支付宝账号
[沙箱应用] 注意 这里需要记录 APPID 及 私钥与支付宝公钥
自定义密钥:
需要安装 支付宝的密钥工具: AlipayDevelopmentAssistant-1.0.11.exe
安装后 ,双击打开, 即:
注意 [应用私钥] 的值 程序中 需要使用, [应用公钥] -在支付宝页面使用
点击[设置] 在 应用公钥的位置 ,填入 刚刚 生成的公钥 生成 支付宝 公钥, [支付宝公钥一定保存好 程序会使用]
切换为 沙箱账号, 可以看到 卖家与买家信息, 注意 ,买家的账号信息, 因为支付时 要 输入 买家信息
以上的 内容准备完毕后 , 支付宝沙箱的配置 基本完成了.
应该记录下来 5个 重要的信息
分别为
appid
网关
应用私钥
支付宝公钥
买家账号及支付密码
创建 工程, 添加 jar
pom.xml
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-thymeleaf
com.alipay.sdk
alipay-sdk-java
4.31.7.ALL
server: port: 8001
编写启动类
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class,args); } }
定义工具类: UUIDUtil .java 生成 随机数据
package com.ly.util;
import java.util.UUID;
public class UUIDUtil {
/**
* 生成可带前后缀的唯一字符串
* @param prefix
* @param suffix
* @return
*/
public static String generateSn(String prefix,String suffix){
return prefix + UUID.randomUUID().toString().replace("-", "").toUpperCase() + suffix;
}
}
编写 沙箱支付工具类
package com.ly.util;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayDataDataserviceBillDownloadurlQueryModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.*;
import com.alipay.api.response.AlipayTradeOrderinfoSyncResponse;
import com.alipay.api.response.AlipayTradePagePayResponse;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Alipay {
/**
* APP_ID 应用id
*/
public final static String APP_ID ="自己的沙箱的APPID";
/**
* 应用私钥
*/
public final static String APP_PRIVATE_KEY="自己的应用私钥";
/**
* 编码
*/
public final static String CHARSET ="UTF-8";
/**
* 支付宝公钥
*/
public final static String ALIPAY_PUBLIC_KEY ="自己的支付宝公钥";
/**
* (沙箱)网关
*/
public final static String GETEWAY_URL ="https://openapi.alipaydev.com/gateway.do";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "内网穿透地址/pay/alipay_notify";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
// public static String return_url = "http://mytest.free.svipss.top/list";
public static String return_url = "内网穿透地址/list"; // 支付成功 最后一步 跳转 返回的 页面
/**
* 格式化
*/
public final static String FORMAT ="json";
/**
* 签名类型
*/
public final static String SIGN_TYPE ="RSA2";
/**
* 用户 下单后 生成 支付宝交易号
* @param sn
* @param info
* @param sub
* @param amount
* @return
*/
public static String genernatePCAlipayHtml(String sn,String info,String sub,BigDecimal amount) {
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(GETEWAY_URL,APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET,ALIPAY_PUBLIC_KEY, SIGN_TYPE);
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(return_url);
alipayRequest.setNotifyUrl(notify_url);
//商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = sn;
//付款金额,必填
String total_amount = amount.toString();
//订单名称,必填
String subject = sub;
//商品描述,可空
String body = info;
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"total_amount\":\""+ total_amount +"\","
+ "\"subject\":\""+ subject +"\","
+ "\"body\":\""+ body +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//请求
String result = null;
try {
AlipayTradePagePayResponse res = alipayClient.pageExecute(alipayRequest);
result = res.getBody();
System.out.println("---------支付宝pc html-------"+result);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return result;
}
}
编写控制层:
package com.ly.controller;
import com.alipay.api.AlipayApiException;
import com.ly.util.Alipay;
import com.ly.util.UUIDUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.math.BigDecimal;
/*
支付 控制层-- 调用沙箱支付 的 api
*/
@Controller
public class PayController {
//生成支付宝 交易号
@GetMapping("/make")
@ResponseBody
public String makeOrderSn() throws AlipayApiException {
String sn = UUIDUtil.generateSn("ly","");
// 生成支付宝 交易号
String paysn = Alipay.genernatePCAlipayHtml(sn,"九阳热水壶","618淘宝活动", BigDecimal.valueOf(50));
System.out.println(paysn);
return paysn;
}
//生成支付宝 交易号
@GetMapping("/list")
@ResponseBody
public String list() throws AlipayApiException {
return "success";
}
}
, 不要访问 接下来 说 内网穿透
我们使用的是 飞鸽的 内网穿透的工具, 免费的隧道 可以使用 7天, 7天后 不可用了, 因此 这里 [最好让一个同学先注册] 其他都用这一个同学的, 等过期了 再换另一个同学的账号
进入到 首页飞鸽管理控制台 (fgnwct.com) 没有账号 注册账号,
然后 登录进入:
进入到 windows_amd64_client 的目录,
双击
看到 上面的内容 表示 内网穿透 成功.
mytest.free.svipss.top 他 就 代表 http://localhost:8001
修改 工具类中的
支付文档说明统一收单下单并支付页面接口 - 支付宝文档中心 (alipay.com)