Spring Boot 使用支付宝沙箱环境

Spring Boot 使用支付宝沙箱环境

最近期末大作业老师要求有使用第三方支付功能,所以试着尝试了一下支付宝的沙箱环境。

要想使用支付宝的沙箱环境,需要先注册支付宝开放平台的账号,使用原有支付宝账号即可。
创建完毕后,点击控制台->研发服务
进入沙箱环境的图片描述
进入研发服务之后,就可以看见沙箱环境的相关内容,接下来就是要配置沙箱环境所需的各种东西。我们需要配置的有RSA2(SHA256)密钥应用网关授权回调地址

第一步先配置RSA2密钥,由于我们开发的是个人项目,所以使用RSA2密钥就可以了,密钥的获取需要下载一些工具,官方的密钥获取教程讲述的还是非常详细的,获取密钥并妥善保管,然后按照教程复制到页面相应位置即可。
配置完密钥是配置应用网关,和授权回调地址
在这里插入图片描述
这是我配置的应用网关和授权回调地址,由于应用网关是服务器发送订单状态消息给你的地址,所以最好要外网可访问吧。。。这个我也不太清楚,反正我配置了内网穿透,配置内网穿透可以下载花生壳,花生壳网站也有官方教程,十分详细,永久http服务六块软妹币。
之后是在项目内的配置。
先加载依赖,在pom.xml文件中添加配置如下代码

<dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.9.124.ALL</version>
</dependency>

之后配置一个配置类AliPayConfig,配置如下

public class AliPayConfig {

    // 作为身份标识的应用ID
    public static String app_id = "2021000116675558";

    // 商户私钥,您的PKCS8格式RSA2私钥
    public static String alipay_private_key  = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCBkKAnZv4pjWpjT62S9z/QW531rPH2tMOYGLNo7ANz5r5KLMjm3cN1WiO7nEr63vXzVYJarzw2XmVnR895xZvn5+90Wf3NvfxXqgWXsGrRSJ1+g8Jw8qeZngyrifi7kWoXq0YKYhVpr522SNgDvbAzYVp/uJgM3P2It2eOHvtXd2G7biPERIFvJRcU8ACMib1+nsOpyB4SuINvW3OsHraxohj4YGWzKjd/8rqAxs6isunfDAwVFaipq1+yWXNVBpW1V/dNCUTbaX+/Fn3N0CU2tbcvyeEMfGkxZr8bfuP/n4uNxGA8nDUgiiyu/QZV6zmXqyK6u3OvhiGuueGZNEGpAgMBAAECggEAdxG2XP+lrAIuNz5OQbW/i3fm3pQleZf9+JUaq93Z/nWbgwdNSf2bVwmTtSKZNZwZY5q9xSEtsLlnb1brMPmNob3grYjWWnGyqc2yfgi+4b5eHppv4uTdaat58VtGnvmwCjh4kao6C3o88fxXqHh2qYFabe3yrj+ZMD98h3upeGMKlvJtsSKTqi62nmD/xBcug8TtMOS1UV+NFAOCJOZ+URzbVDYAn0QjnHuwDKkcqORH1YapwsXXLEZ4LdVw0QomkcdnpSc05K4fQU1YvbAGvONbAOinkUI7f/NLnCpI8S0yA/UU8fK9L68NemrXvRGPRZt6oUPbexE402p+EIj8UQKBgQDCVszZ5lbFcVYa6EZ502QbeUzSXUA3h8AAOCezdpEJYf1lH5q5WItLwMbd91PS5xm101FH58ZorPTDnD/VZUMGwz+iHaV7j/ap4HxTbvsJ5tm/ds7UokMB0rsmXNHXRg8cqTgs2VMnGfGij1bkdlKPcP8KacnhI8EETB+v7hRQRwKBgQCqrItew6jJn7WDN5id+jfmJwmcmpz9n3ACdfz+uVnF5dN5KwoaXnFpQNlZJL2zpw5T0KMEeQEiXE8VDgANNFrGvypdqrGP4RZ/XZIuz+STpg0Ah01WILMeSSJBgnJWPnop9iYMbFlLoYSBlRSwAtGwKAVNxHqjzsFOiRBaHthGjwKBgQCBeCxfWpoiTeBMasRQ8yj1OLmaSC+5DwI14zNn1yzG8HZNQWHl6vxaCmMyi0xX7Ehvnwm+esXvBJLIIrdQJnch8T/adB/EEuQExp5tQzmRni8g5Djk5fj4JPkzlJDj9zOoJ4BaOKqyGRGm+BGugLl+AIyY1mN9T0GO6FwP6++yjwKBgG4zctoBY96r7LuJDlYS1j0ZP6+KdYudgulT3cNrUnfhaaZ3D9Lu4DOh17UjcAmr+ChOMrQUnZLeH4HsxEPCZkql7GkGahgIskoS1Oy8904OjZ6lvl26R21qs1+xJrphJOgrM24aF54p8DDrXaw4ZcRkUuhf0QAr480d2x0VhXgpAoGAVCOYVV5mgczwsNjSiXyrrTei9sp/1uJf4YrdAQ0lZ0DkQb6Nvxl83xVn1xLE3VVd827XrneTHbPb6E3aTGbXhjjJVo8kAeFGyiQDF6VuSEL7j38qGkMtLzaRK2unHsVr1eBPT6tzVU1WD9EAyOaDM90wWpU+166VqOhhaQvx3VE=";

    // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAokZNbq02kZfeCuRToRGICmEYilOosT7iHXe1UZTNuZIkXLIC/27a2ZaimRw0Nn7mUOgEvgSBvx+13TrQ3qvbF+WDMmbV+Y/JINE2CQRQBNvMhvNoMAZrPU3DtnMINW2SiXuBKLEo9TcHUyhAODj/HwEvP8eGXt5jlIKcxSIZZCKI4bd/pSlpdPb+mXxPImJ3hraDEfaa6sPQ4dBmKNF9Hx4d/U4sP1+oKT0LxMWVED/KCMzLJ+guy0ls1E9CMvzgEkRgRM7eZ7mvl0flv9HCrBDc8wBrjd7/Uh6FjloLRm08zCc4Pu33SKFfw48Ea0gtnVS8M365rgnt4Q9Dev/LkwIDAQAB";

    // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String notify_url = "http://362450r38x.zicp.vip/alipay/pay";

    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String return_url = "https://openapi.alipaydev.com/gateway.do";

    // 签名方式
    public static String sign_type = "RSA2";

    // 字符编码格式
    public static String charset = "utf-8";

    // 支付宝网关
    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
}

配置AliPayController类如下:

@Controller
@RestController
@RequestMapping("/alipay")
public class AliPayController {

    /**
     * 支付接口
     *
     * @param orderId 订单id
     * @param amount  支付金额
     * @param product 商品名称
     * @param body    商品描述
     * @return
     * @throws AlipayApiException
     */
    @GetMapping("/pay/{orderId}/{amount}/{product}/{body}")
    public String aliPay(@PathVariable String orderId,
                         @PathVariable String amount,
                         @PathVariable String product,
                         @PathVariable String body) throws AlipayApiException {

//获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.gatewayUrl,
                AliPayConfig.app_id,
                AliPayConfig.alipay_private_key,
                "json",
                AliPayConfig.charset,
                AliPayConfig.alipay_public_key,
                AliPayConfig.sign_type);
//        page
        AlipayTradePagePayRequest alipayPageRequest = new AlipayTradePagePayRequest();
        alipayPageRequest.setReturnUrl(AliPayConfig.return_url);
        alipayPageRequest.setNotifyUrl(AliPayConfig.notify_url);


        //拼接参数
        alipayPageRequest.setBizContent("{\"out_trade_no\":\"" + orderId + "\","
                + "\"total_amount\":\"" + amount + "\","
                + "\"subject\":\"" + product + "\","
                + "\"body\":\"" + body + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //请求
        return alipayClient.pageExecute(alipayPageRequest).getBody();
    }
}

之后只要在你需要调用支付宝沙箱接口的时候,按照"/alipay/pay/订单编号/总价钱/商品名称/商品描述"调用即可,但是商品订单编号需要九位,如下处理即可。
int num = userService.getBillNum();
String str = String.format("%09d", num);

以下是一个简单的支付宝沙箱支付Spring Boot后端代码示例: 首先,你需要引入以下依赖: ``` <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.7.110.ALL</version> </dependency> ``` 然后,创建一个支付服务类: ``` @Service public class AlipayService { // 私钥 private static final String APP_PRIVATE_KEY = "xxxxxx"; // 公钥 private static final String ALIPAY_PUBLIC_KEY = "xxxxxx"; // 应用ID private static final String APP_ID = "xxxxxx"; // 编码格式 private static final String CHARSET = "utf-8"; // 支付宝网关 private static final String GATEWAY_URL = "https://openapi.alipaydev.com/gateway.do"; /** * 支付宝支付 * @param orderId 订单ID * @param totalAmount 订单总金额 * @return 支付结果 * @throws AlipayApiException */ public String alipay(String orderId, String totalAmount) throws AlipayApiException { AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl("http://localhost:8080/alipay/return"); alipayRequest.setNotifyUrl("http://localhost:8080/alipay/notify"); alipayRequest.setBizContent("{\"out_trade_no\":\"" + orderId + "\"," + "\"total_amount\":\"" + totalAmount + "\"," + "\"subject\":\"测试订单\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); String result = alipayClient.pageExecute(alipayRequest).getBody(); return result; } /** * 支付宝支付异步通知处理 * @param request * @throws AlipayApiException */ public void alipayNotify(HttpServletRequest request) throws AlipayApiException { Map<String, String> params = new HashMap<String, String>(); Map<String, String[]> requestParams = request.getParameterMap(); for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } params.put(name, valueStr); } boolean signVerified = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET, "RSA2"); if (signVerified) { // 验证成功 String tradeStatus = request.getParameter("trade_status"); if ("TRADE_SUCCESS".equals(tradeStatus)) { // 处理支付成功业务逻辑 } } } } ``` 在这个代码,我们使用支付宝提供的 Java SDK,使用沙箱环境网关 URL。我们还提供了一个处理支付宝异步通知的方法,以便在收到支付宝通知时处理业务逻辑。 最后,我们需要在控制器定义支付接口和异步通知接口: ``` @RestController @RequestMapping("/alipay") public class AlipayController { @Autowired private AlipayService alipayService; @GetMapping("/pay") public String alipay(@RequestParam String orderId, @RequestParam String totalAmount) throws AlipayApiException { return alipayService.alipay(orderId, totalAmount); } @PostMapping("/notify") public void alipayNotify(HttpServletRequest request) throws AlipayApiException { alipayService.alipayNotify(request); } @GetMapping("/return") public String alipayReturn(HttpServletRequest request) throws AlipayApiException { // 处理支付宝同步通知 return "支付成功"; } } ``` 在这个示例,我们定义了一个支付接口,`/alipay/pay`,接收订单ID和总金额,返回支付宝支付页面的 HTML 代码。我们还定义了一个异步通知接口,`/alipay/notify`,用于处理支付宝异步通知,并处理支付成功业务逻辑。最后,我们还定义了一个同步通知接口,`/alipay/return`,用于处理支付宝同步通知。 这是一个简单的支付宝沙箱支付Spring Boot后端代码示例。你可以根据自己的业务需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值