支付宝沙箱支付问题

调试错误,请回到请求来源地,重新发起请求。

错误代码 invalid-signature 错误原因: 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配,网关生成的验签字符串为:alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=9021000136620350&charset=UTF8&format=json&method=alipay.trade.page.pay&notify_url=http://4n39q4.natappfree.cc&return_url=http://localhost:8080/flowerSales/front/index.jsp&sign_type=RSA2&timestamp=2024-04-22 12:36:25&version=1.0

1.问题描述

起因,在做毕设的时候导师突然加了一个支付宝沙箱模拟支付的功能,然后我参考网上代码紧急加上了功能
Springboot支付宝沙箱支付---完整详细步骤-CSDN博客

 以下是我参考上诉代码写的,但是出现了问题

package com.controller;



import cn.hutool.json.JSONObject;
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.AlipayTradeCreateRequest;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradeCreateResponse;
import com.baomidou.mybatisplus.activerecord.Model;
import com.entity.OrdersEntity;
import com.entity.YonghuEntity;
import com.utils.R;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


@RestController
@RequestMapping("/pay")
public class PayController {
    //appid
    // private final String APP_ID = "9021000136639112";
    private final String APP_ID = "9021000136620350";
    //应用私钥
    private final String APP_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDD+vOyVTFcnt6jP+zkhL58rPTbAo3CNhCI3xeISVsKK+YpPo7relHZbJKEepKPRsiBwr8wz42xzs3FrZshBThKghRmsZNzEJ0bIkbetlygwJlGJIjON5frkQvIUZ6QajMXzPGlU6OwvPxUjUL52xCz901x/IWwdRqZ4CgmBi50jWBLGDHVJB0D8hm99WMx7NgOSiWac1NF432PGPrSRWet7zoeEKgp9YVvLFXa9nsiwBtZaMRLv238q2Vrqd3WbF9o0NmL1kdTY8XT/s40jEFSw0bMHLRmYnsL4CfmmIF/8tld/7TPNGQmbxolq0Iq2+qh7K66uF8u2l3C/NH0wrw1AgMBAAECggEAK+I+vXkMI5RDgESpNAZxbROBhKUOvyVCEJP7/f2HEEECOcwTTrFGMKx6JoYX2VNdRIkqLLDdJqqLMy+LpBo6H5z/Gnu667IVq+TB/87P8QMPj0BRDfQu5YXGIKX+HpJZPIQcvAt9hO7chcZX8ADYvaOryNFl0jx2p2wlMVaDAn/ddvCYi3rL5BU0bLNFCtSgQTd+dTRIWeWngXGNGJ04sMoa5ZdzduCEZxOCVU+DNmCPJHyeOQS3YVd+XLPW/784cxGcRJS/bnGhbpC5TvWOlz+UH0wekJOSvo/G5rnUXXBIEvZ8z6BpC3aDyuCQz7uEX+CUzI13U8LRo8DdEcdTAQKBgQDg0pwoUJ04VT9JBd+0I5D94sWK0ncjLA8ZIo7M85IbR0rNwTBT2kf+4q5DpbUrCUGNiY15uFNsy78/Qd5LnNv9RJCsAZp3vMvhA1OQegR6UzQ1OUFrdQIAB/AYZoJooVbt+sT/QFGFNj/Mk/sWhcGbHHaczwWkZI3h9FAuCgY1QQKBgQDfKGmf6BPW5zwhb+L+g7/g1ipwYOjHnzGcADmcRi0pTVnjScSyMUojfOGM/IuZt8YD+yiKjTrok2HV8wzoE7195BaZ+PRXCuDQhgm9rFC63DaMUPbHs223JQne2x37BGIDBVUf1DCcIKLehvQWfzCaXo95m/i4OM7XIy9SNmeF9QKBgQC5ZXRY2oGMHuBdO3bKejnq48K7Q+vzGTYqKBFSedmWnSfWnOVZgLu2OQAz0MahgrSIH1KHebVyFmLTq2HBQM05Af27mmbjLtGB8NhMYBKpPUvkSB7mmkrX87POq1oHJmUlQpKJW2TeUWozLiT04cBSRRqbHS0t764BExO7o5CTAQKBgFdNcR0c5v4REqYmJpDZrCxivNGgKBFIh1j3gZJQpgRdfYf86RWpUM7XYUoN1vN5QN9316F0pRIt7n2MC4WTi3N/0xPDoJuY5uDNP2xTyHWCB1kXp6Py3z5iIB1ubakxSsLRyD6efbHm1rDl7QIMGlCaI9k4mrI/jzP9UNsB67gtAoGAOcaiTddPBiUEcubwDGSYbM6RN7f62FpA78Uy9R5PwLjcvbk683yeE8S4UFSKlr2wj+2/IH+aGr4HKosKuCfYySOf04zzLrMRsTMAAWCt8G9nr/kmStK6yf3pywaD8oZsS4thb8PVFo44LOnF+8Y3h9YSCtUaAkQDz3CfXbVUOhA=" ;
    private final String CHARSET = "UTF8";
    // 支付宝公钥
    private final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw/rzslUxXJ7eoz/s5IS+fKz02wKNwjYQiN8XiElbCivmKT6O63pR2WyShHqSj0bIgcK/MM+Nsc7Nxa2bIQU4SoIUZrGTcxCdGyJG3rZcoMCZRiSIzjeX65ELyFGekGozF8zxpVOjsLz8VI1C+dsQs/dNcfyFsHUameAoJgYudI1gSxgx1SQdA/IZvfVjMezYDkolmnNTReN9jxj60kVnre86HhCoKfWFbyxV2vZ7IsAbWWjES79t/Ktla6nd1mxfaNDZi9ZHU2PF0/7ONIxBUsNGzBy0ZmJ7C+An5piBf/LZXf+0zzRkJm8aJatCKtvqoeyuurhfLtpdwvzR9MK8NQIDAQAB";
    //这是沙箱接口路径,正式路径为https://openapi.alipay.com/gateway.do
    // private final String GATEWAY_URL ="https://openapi.alipaydev.com/gateway.do";
    // private final String GATEWAY_URL ="https://openapi-sandbox.dl.alipaydev.com/gateway.do";
    private final String GATEWAY_URL = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";

    private final String FORMAT = "json";
    //签名方式
    private final String SIGN_TYPE = "RSA2";
    //支付宝异步通知路径,付款完毕后会异步调用本项目的方法,必须为公网地址
    private final String NOTIFY_URL = "http://4n39q4.natappfree.cc";

    //支付宝同步通知路径,也就是当付款完毕后跳转本项目的页面,可以不是公网地址
    // private final String RETURN_URL = "http://localhost:8080/returnUrl";
    private final String RETURN_URL = "http://localhost:8080/flowerSales/front/index.jsp";

       // 必须加ResponseBody注解,否则spring会寻找thymeleaf页面
    @PostMapping("/alipay")
    public R alipay(HttpSession session, HttpServletResponse response,
                    @RequestBody YonghuEntity yonghu) throws AlipayApiException, IOException {
        //把dona_id项目id 放在session中
        session.setAttribute("dona_id",yonghu.getId());
        // session.setAttribute("dona_id","123");
// 很可能是编码问题,指定一下编码即可
        response.setContentType("text/html;charset=UTF-8");

        //生成订单号(支付宝的要求?)
        String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        String user = UUID.randomUUID().toString().replace("-","").toUpperCase();

        String OrderNum = time+user;
        //调用封装好的方法(给支付宝接口发送请求)
        String result = sendRequestToAlipay(OrderNum, yonghu.getMoney(),"ghjk");
        return R.ok().put("result",result);
    }

    /*
参数1:订单号
参数2:订单金额
参数3:订单名称
 */
    //支付宝官方提供的接口
    private String sendRequestToAlipay(String outTradeNo,Float totalAmount,String subject) throws AlipayApiException, UnsupportedEncodingException {
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_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 body = "";
        alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\","
                + "\"total_amount\":\"" + totalAmount + "\","
                + "\"subject\":\"" + subject + "\","
                + "\"body\":\"" + body + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        String result = alipayClient.pageExecute(alipayRequest).getBody();
        // String result = alipayClient.sdkExecute(alipayRequest).getBody();
        // String apiUrl=GATEWAY_URL+"?"+result;
        // System.out.println("apiUrl=-------"+apiUrl);
        // return apiUrl;
        return result;
    }
}

控制台会输出两个结果,一个是url,另一个是表单,表单里面有url,但是我分离处action中的url之后打开也不对,
这个是url,可以跳转到支付页面的

https://openapi-sandbox.dl.alipaydev.com/gateway.do?alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=9021000136620350&biz_content=%7B%22out_trade_no%22%3A%2220240422123625739A187C441D4556B2FB6CFE89847407%22%2C%22total_amount%22%3A%2211680.0%22%2C%22subject%22%3A%22ghjk%22%2C%22body%22%3A%22%22%2C%22product_code%22%3A%22FAST_INSTANT_TRADE_PAY%22%7D&charset=UTF8&format=json&method=alipay.trade.page.pay&notify_url=http%3A%2F%2F4n39q4.natappfree.cc&return_url=http%3A%2F%2Flocalhost%3A8080%2FflowerSales%2Ffront%2Findex.jsp&sign=HX1tAx2p6cvSkdy4enQjp%2FvrX3Y9U5r3QhdD0kH%2FRazBsEcg0O%2Bee43rX%2FTvZ4iqk5vmEomzBU6OdpdybA2fkEaBj%2Bwi%2FEM3sy4yv3jurhDkMwlw9qkEi0vUorlNe7wgtVorLakdIuGBreBp%2B%2BMWIyYyz5F%2FkGJb24BENg86U4YFfCUR3rxhQiri%2FcpcrNPHfMxYxj6e4JwIBowg2xDSJiv1plrUuhDuzd309elDvcPv9HtsyHpg0vQat7SD8eLbgKEcwsckc4LpMmiG6LiHcOCuA%2BxEG3ek74XfMOTTinzu%2FlpNbO7F%2Fx3kocVkWtauRKPm4X5bdrUnc0uohtxoMw%3D%3D&sign_type=RSA2&timestamp=2024-04-22+12%3A36%3A25&version=1.0

 这个是返回的表单,但是action指向的地址是不正确的(我这里是不正确的)

2024-04-22 12:36:25 -330847 [http-nio-8080-exec-5] DEBUG   - Written [{result=https://openapi-sandbox.dl.alipaydev.com/gateway.do?<form name="punchout_form" method="post" action="https://openapi-sandbox.dl.alipaydev.com/gateway.do?charset=UTF8&method=alipay.trade.page.pay&sign=HX1tAx2p6cvSkdy4enQjp%2FvrX3Y9U5r3QhdD0kH%2FRazBsEcg0O%2Bee43rX%2FTvZ4iqk5vmEomzBU6OdpdybA2fkEaBj%2Bwi%2FEM3sy4yv3jurhDkMwlw9qkEi0vUorlNe7wgtVorLakdIuGBreBp%2B%2BMWIyYyz5F%2FkGJb24BENg86U4YFfCUR3rxhQiri%2FcpcrNPHfMxYxj6e4JwIBowg2xDSJiv1plrUuhDuzd309elDvcPv9HtsyHpg0vQat7SD8eLbgKEcwsckc4LpMmiG6LiHcOCuA%2BxEG3ek74XfMOTTinzu%2FlpNbO7F%2Fx3kocVkWtauRKPm4X5bdrUnc0uohtxoMw%3D%3D&return_url=http%3A%2F%2Flocalhost%3A8080%2FflowerSales%2Ffront%2Findex.jsp&notify_url=http%3A%2F%2F4n39q4.natappfree.cc&version=1.0&app_id=9021000136620350&sign_type=RSA2&timestamp=2024-04-22+12%3A36%3A25&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json">
<input type="hidden" name="biz_content" value="{&quot;out_trade_no&quot;:&quot;20240422123625739A187C441D4556B2FB6CFE89847407&quot;,&quot;total_amount&quot;:&quot;11680.0&quot;,&quot;subject&quot;:&quot;ghjk&quot;,&quot;body&quot;:&quot;&quot;,&quot;product_code&quot;:&quot;FAST_INSTANT_TRADE_PAY&quot;}">
<input type="submit" value="绔嬪嵆鏀粯" style="display:none" >
</form>
<script>document.forms[0].submit();</script>, code=0}] as "application/json" using [org.springframework.http.converter.json

 2.问题解决

找了很多方法,也没找到,后来 找到了这边文章java接入支付宝支付接口沙箱环境测试(傻瓜式,有手就行版本)_java支付宝移动支付开发怎么测试-CSDN博客

 我原来使用的是pageExecute方法,换了sdkExecute方法,然后和‘

https://openapi-sandbox.dl.alipaydev.com/gateway.do’拼接,就可以得到正确的支付链接了

  • 36
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值