一:准备工作

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

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

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

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

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

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

二:开发代码

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

AlipayConfig:
public class AlipayConfig {//支付宝商户号的APPIDpublic 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<String, String> sourceMap) throws IOException;
}
AlipayServiceImpl:
@Service
public class AlipayServiceImpl implements AlipayService {@Overridepublic String toAlipay(Map<String, String> 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:
@Controller
public class AlipayController {@Autowiredpublic AlipayService alipayService;@RequestMapping("pay")public void toAlipay(HttpServletRequest httpRequest , HttpServletResponse httpResponse, String payId, String totalFee, String body) throws IOException {//生成一笔支付记录,支付完成时将支付状态改为成功Map<String, String> 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<String, String> 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<String, String> 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";}//将请求中的参数转换为Mappublic static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {Map<String, String> retMap = new HashMap();Set<Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();Iterator var3 = entrySet.iterator();while(true) {while(var3.hasNext()) {Entry<String, String[]> 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支付,有兴趣请关注博主

支付宝PC(二维码扫码)支付(Java开发)完整版相关推荐

  1. VB6 简单实现 支付宝二维码扫马支付

    VB6 简单实现 支付宝二维码扫马支付 完整源码如下 Private Declare Function 初始化 Lib "alipay.dll" (ByVal 服务器 As Str ...

  2. 【亲测】独家更新CcPay多商户码支付系统,码支付易支付+个人支付宝微信二维码收款app监控+搭建教程

    「BudPay 个人收款」 的原理是通过安装到手机的App监控手机微信.支付宝的二维码扫码支付到账通知并回调开发者应用.消费者在支付的时候是扫描开发者的个人微信.支付宝收款二维码. 支持API调用.手 ...

  3. 移动二维码支付 推进二维码扫码智能POS

    现如今:银币.再到纸币,演变到"钱"变得越来越轻薄.在现在这个移动支付市场中,互联网技术的支撑下,刷手机乘公交.刷支付宝买菜购物.缴水电费--日常生活中使用"现金&quo ...

  4. Springboot整合支付宝自定义二维码支付

    话不多说 上效果图 依赖第一步 <dependency><groupId>com.alipay.sdk</groupId><artifactId>ali ...

  5. 对支付宝微信们来说,扫码支付限额 500 元新规意味着什么?

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 12月27日下午,据中国人民银行(下称央行)网站消息,将于近日发布关于印发<条码支付业 ...

  6. 支付宝商家二维码收款、订单状态查询、退款API试用笔记

    情景 商家的app或商城支持支付宝支付,支付的方式是商家根据商品价格生成相应的付款二维码,用户扫码付款,同时商家需要查看支付订单状态,备货出货,当然还要支持退款. 准备测试环境 1.开通开发者服务 用 ...

  7. 二维码扫码登录是什么原理?

    在日常生活中,二维码出现在很多场景,比如超市支付.系统登录.应用下载等等.了解二维码的原理,可以为技术人员在技术选型时提供新的思路.对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的各种二 ...

  8. 细说二维码扫码登录的原理

    前言 在日常生活中,二维码出现在很多场景,比如超市支付.系统登录.应用下载等等.了解二维码的原理,可以为技术人员在技术选型时提供新的思路.对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的 ...

  9. 聊聊二维码扫码登录的原理

    点击上方 "大数据肌肉猿"关注, 星标一起成长 后台回复[加群],进入高质量学习交流群 2021年大数据肌肉猿公众号奖励制度 原文:https://juejin.cn/post/6 ...

  10. 面试官:说说二维码扫码登录是什么原理吗?

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 juejin.cn/post/6940976355097985032 推荐:ht ...

最新文章

  1. 学python比较好的书-学习Python比较好的书籍推荐
  2. 分布式数据库CAP原理和Base
  3. boost::hana::one用法的测试程序
  4. Javascript实现最简跨平台面向对象拖拽
  5. 什么是Web Server
  6. 单片机如何在一数据包前加标识呢_单挑Google面试官,一上来就问我Chrome底层原理和HTTP协议(万字长文)...
  7. jquery 对象 和 js 对象 为什么要互相转换?_JQuery对象与dom对象两者之间的相互转换...
  8. 深入解读Linux内存管理系列(2)——内存节点的添加
  9. 进销存excel_(升级版)进销存管理系统,含Excel函数公式全自动,高效率
  10. 吉珠计算机专业插本学校,2015年吉珠与北理珠的专插本考生必看:招生专业数据统计...
  11. JS函数传参长度限制
  12. 上帝掷骰子吗:量子物理史话
  13. namecheap域名设置Cloudflare为第三方DNS
  14. mac tortoisesvn客户端_TortoiseSVN
  15. 计算机开机最快,电脑开机速度,最快几秒?
  16. CF949D Curfew
  17. github上实用、常用的插件和库
  18. Win10域客户端强制更改壁纸
  19. Python中print换行问题
  20. C++ fstream 在文件末尾写入问题

热门文章

  1. dell 服务器启用虚拟化,打开DELL R410服务器BIOS虚拟化步骤(图文教程)
  2. bcnf分解算法_BCNF的保持无损连接的分解
  3. 关系数据库理论:范式判断、函数依赖、无损分解、正则覆盖
  4. 在线教育十字路口:新东方遭危机 YY欲成颠覆者
  5. android上的sip软电话
  6. 创建销售订单的BAPI
  7. Java的getbytes()方法使用
  8. 关于设计BOM和制造BOM的介绍
  9. 英文书籍下载网站统计(进行中)
  10. 软件著作权登记申请容易通过吗?软著申请成功率高吗?