千家信息网

Java怎么实现支付宝PC支付功能

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,本篇内容介绍了"Java怎么实现支付宝PC支付功能"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一:
千家信息网最后更新 2024年11月23日Java怎么实现支付宝PC支付功能

本篇内容介绍了"Java怎么实现支付宝PC支付功能"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一:准备工作

1:如没有账号的请先去 支付宝商户平台 注册商户号

2:开发前需要导入支付宝SDK 支付宝SDK下载链接 Maven依赖也在里面

3:生成支付宝密钥、公钥,需要用到支付宝密钥生成工具 密钥生成工具下载链接 ,密钥用于签名使用

4:电脑网站支付结果异步通知(关于支付结果异步通知后续会专门写一个博客,需要重点注意)

注意:请先详细查看官方文档按步骤开发,一切以官方文档为主 支付宝官方开发文档,如使用老接口请移步 老版即时到账文档

5:测试的时候一定要使用内网穿透软件,否则会报错

二:开发代码

这里使用的是沙箱环境,正式上线时请将环境改为正式环境

AlipayConfig:

public class AlipayConfig { public static String APPID = "";  //用支付宝密钥生成工具生成的私钥 public static String RSA_PRIVATE_KEY = "";  //电脑网站支付结果异步通知,可以参考异步文档,一定要是外网能访问的 public static String notify_url = "";   //电脑网站支付结果同步通知,用于转跳到用户自己的页面,一定要是外网能访问的 public static String return_url = "";   //沙箱接口,正式上线时请改用正式支付接口 public static String URL = "https://openapi.alipaydev.com/gateway.do";  public static String CHARSET = "UTF-8"; public static String FORMAT = "json";  //用支付宝密钥生成工具生成的公钥 public static String ALIPAY_PUBLIC_KEY = ""; public static String log_path = "/log"; public static String SIGNTYPE = "RSA2";  public AlipayConfig() { }}

AlipayService:

public interface AlipayService { public String toAlipay(Map sourceMap) throws IOException;}

AlipayServiceImpl:

@Servicepublic class AlipayServiceImpl implements AlipayService {  @Override public String toAlipay(Map sourceMap) throws IOException {  AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL,AlipayConfig.APPID,AlipayConfig.RSA_PRIVATE_KEY,AlipayConfig.FORMAT,AlipayConfig.CHARSET,AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);  AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();  alipayRequest.setReturnUrl(AlipayConfig.return_url);  alipayRequest.setNotifyUrl(AlipayConfig.notify_url);  AlipayTradeWapPayModel alipayTradeWapPayModel = new AlipayTradeWapPayModel();  alipayTradeWapPayModel.setOutTradeNo(sourceMap.get("out_trade_no"));  alipayTradeWapPayModel.setProductCode("FAST_INSTANT_TRADE_PAY");  alipayTradeWapPayModel.setTotalAmount(sourceMap.get("total_amount"));  alipayTradeWapPayModel.setSubject("Alipay");  alipayTradeWapPayModel.setBody(sourceMap.get("body"));  alipayRequest.setBizModel(alipayTradeWapPayModel);  String form="";  try {   form = alipayClient.pageExecute(alipayRequest).getBody();  } catch (AlipayApiException e) {   e.printStackTrace();  }  return form; } }

AlipayController:

@Controllerpublic class AlipayController {  @Autowired public AlipayService alipayService;   @RequestMapping("pay") public void toAlipay(HttpServletRequest httpRequest , HttpServletResponse httpResponse, String payId, String totalFee, String body) throws IOException {   //生成一笔支付记录,支付完成时将支付状态改为成功    Map sourceMap = new HashMap<>();  sourceMap.put("out_trade_no",payId);  sourceMap.put("total_amount",totalFee);  sourceMap.put("body",getUTF8XMLString(body));    String form = alipayService.toAlipay(sourceMap);  httpResponse.setContentType("text/html;charset=" + AlipayConfig.CHARSET);  httpResponse.getWriter().write(form);  httpResponse.getWriter().flush();  httpResponse.getWriter().close(); }   //注意异步返回结果通知是以post请求形式返回的 @RequestMapping("notifyUrl") public String notify_url(HttpServletRequest request){  Map paramsMap = convertRequestParamsToMap(request);  String out_trade_no= paramsMap.get("out_trade_no");  try {   boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);   //无论同步异步都要验证签名   if(signVerified){    if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){     //处理自己系统的业务逻辑,如:将支付记录状态改为成功,需要返回一个字符串success告知支付宝服务器          return "success";    } else {     //支付失败不处理业务逻辑     return "failure";    }   }else {    //签名验证失败不处理业务逻辑    return "failure";   }  } catch (AlipayApiException e) {   e.printStackTrace();   return "failure";  } }  //注意同步返回结果是以get请求形式返回的 @RequestMapping("returnUrl") public String return_url(HttpServletRequest request){  Map paramsMap = convertRequestParamsToMap(request);  try {   boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);   if(signVerified){    //跳转支付成功界面    return "支付成功页面";    }else {    //跳转支付失败界面    return "failure";   }  } catch (AlipayApiException e) {   e.printStackTrace();  }  return "success"; }   //将请求中的参数转换为Map public static Map convertRequestParamsToMap(HttpServletRequest request) {  Map retMap = new HashMap();  Set> entrySet = request.getParameterMap().entrySet();  Iterator var3 = entrySet.iterator();   while(true) {   while(var3.hasNext()) {    Entry entry = (Entry)var3.next();    String name = (String)entry.getKey();    String[] values = (String[])entry.getValue();    int valLen = values.length;    if(valLen == 1) {     retMap.put(name, values[0]);    } else if(valLen <= 1) {     retMap.put(name, "");    } else {     StringBuilder sb = new StringBuilder();     String[] var9 = values;     int var10 = values.length;      for(int var11 = 0; var11 < var10; ++var11) {      String val = var9[var11];      sb.append(",").append(val);     }      retMap.put(name, sb.toString().substring(1));    }   }    return retMap;  } }  //将字符串转换为UTF-8编码以防出现乱码错误 public static String getUTF8XMLString(String xml) {  StringBuffer sb = new StringBuffer();  sb.append(xml);  String xmString = "";  String xmlUTF8="";  try {   xmString = new String(sb.toString().getBytes("UTF-8"));   xmlUTF8 = URLEncoder.encode(xmString, "UTF-8");  } catch (UnsupportedEncodingException e) {   e.printStackTrace();  }  return xmlUTF8; }}

至此代码已经完成!!!

三:演示结果

注意:扫码或者登陆账户时如果用的是沙箱开发环境请使用沙盒支付宝APP扫码,或者使用沙盒账户支付,否则会弹出码已失效错误

支付宝沙箱

支付成功页面是从支付结果同步通知controller中跳转的,后续会更新最详细最完整的微信Navicat支付跟PayPal支付

"Java怎么实现支付宝PC支付功能"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0