调试错误,请回到请求来源地,重新发起请求。
错误代码 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¬ify_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×tamp=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¬ify_url=http%3A%2F%2F4n39q4.natappfree.cc&version=1.0&app_id=9021000136620350&sign_type=RSA2×tamp=2024-04-22+12%3A36%3A25&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json">
<input type="hidden" name="biz_content" value="{"out_trade_no":"20240422123625739A187C441D4556B2FB6CFE89847407","total_amount":"11680.0","subject":"ghjk","body":"","product_code":"FAST_INSTANT_TRADE_PAY"}">
<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’拼接,就可以得到正确的支付链接了