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(MapsourceMap) throws IOException;}
AlipayServiceImpl:
@Servicepublic class AlipayServiceImpl implements AlipayService { @Override public String toAlipay(MapsourceMap) 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 { //生成一笔支付记录,支付完成时将支付状态改为成功 MapsourceMap = 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支付功能"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
支付
结果
生成
密钥
成功
文档
开发
工具
沙箱
环境
网站
UTF-8
同步
业务
官方
接口
电脑
逻辑
页面
处理
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网易音乐四叶草服务器
上海栈谷网络技术有限公司
pg数据库查询超时时间
网络安全用户信息保护制度
欧瑞数据库
服务器月流量500g包怎么算
评论网络安全审查办法
网络安全倡议班会
r-play无法连接到服务器
德惠智能网络技术什么价格
杭州财务软件开发中心
数据库应用程序主程序
删除数据库的列
数据库查询相同名字的学生
漫话网络安全合规
联想dl380g5服务器怎么用
软件技术好还是网络技术好
柏培欧网络技术有限公司
服务器的数据如何保证安全
文件服务器的访问
无线传感网络技术的军事应用
阿里云服务器数据同步软件
nosql数据库具有哪些类型
云南新一代软件开发标准
用现金支付软件开发费
福建正规软件开发服务品质保障
数据库课表
软件开发行业质量目标
阿里云优惠服务器
计算机时间与时间服务器同步失败