支付宝支付 第九集:产品数据和支付二维码对接
支付宝支付 第九集:产品数据和支付二维码对接
一、问题
二、代码
目录结构
更新AlipayServiceImpl.java
package com.dzy.alipay.service;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.domain.AlipayTradePrecreateModel; import com.alipay.api.request.AlipayTradePrecreateRequest; import com.alipay.api.response.AlipayTradePrecreateResponse; import com.dzy.alipay.config.AlipayConfig; import com.dzy.alipay.entity.ProductCourse; import com.dzy.alipay.qrcode.QRCodeUtil; import com.dzy.alipay.qrcode.QrCodeResponse; import com.dzy.alipay.qrcode.QrResponse; import com.dzy.alipay.service.course.ProductCourseService; import com.dzy.alipay.util.GenerateNum; import com.dzy.alipay.vo.PayVo; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.FileCopyUtils; import org.springframework.util.ResourceUtils;import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File;@Service @Log4j2 public class AlipayServiceImpl implements AlipayService {private final ProductCourseService productCourseService;private final AlipayConfig alipayConfig;public AlipayServiceImpl(AlipayConfig alipayConfig, ProductCourseService productCourseService) {this.alipayConfig = alipayConfig;this.productCourseService = productCourseService;}/** @Author* @Description 阿里支付 -打赏* @Date 23:59 2020/9/8* @Param [payVo]* @return byte[]**/@Overridepublic byte[] alipay(PayVo payVo) {try {ProductCourse productCourse = productCourseService.getById(payVo.getCourseid());if(productCourse==null){return null;}// 1:支付的用户String userId = payVo.getUserId();// 2: 支付金额String money = productCourse.getPrice().toString();// 3: 支付的产品String title = productCourse.getTitle();// 4: 支付的订单编号String orderNumber = GenerateNum.generateOrder();// 5:支付宝携带的参数在回调中可以通过request获取JSONObject json = new JSONObject();json.put("userId", userId);json.put("orderNumber", orderNumber);json.put("money", money);String params = json.toString();// 6:设置支付相关的信息AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();model.setOutTradeNo(orderNumber); // 自定义订单号model.setTotalAmount(money);// 支付金额model.setSubject(title);// 支付的产品名称model.setBody(params);// 支付的请求体参数model.setTimeoutExpress("30m");// 支付的超时时间model.setStoreId(userId + "");// 支付的库存idQrCodeResponse qrCodeResponse = qrcodePay(model);ByteArrayOutputStream output = new ByteArrayOutputStream();String logoPath ="";try {logoPath = ResourceUtils.getFile("classpath:favicon.png").getAbsolutePath();}catch (Exception ex){logoPath = new File("/www/image/favicon.png").getAbsolutePath();}BufferedImage buffImg = QRCodeUtil.encode(qrCodeResponse.getQr_code(), logoPath, false);//获取二维码ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);ImageIO.write(buffImg, "JPEG", imageOut);imageOut.close();ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());return FileCopyUtils.copyToByteArray(input);} catch (Exception ex) {ex.printStackTrace();return null;}}/*** 扫码运行代码* 验签通过返回QrResponse* 失败打印日志信息* 参考地址:https://opendocs.alipay.com/apis/api_1/alipay.trade.app.pay*/public QrCodeResponse qrcodePay(AlipayTradePrecreateModel model) {// 1: 获取阿里请求客户端AlipayClient alipayClient = getAlipayClient();// 2: 获取阿里请求对象AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();// 3:设置请求参数的集合,最大长度不限request.setBizModel(model);// 设置异步回调地址request.setNotifyUrl(alipayConfig.getNotify_url());// 设置同步回调地址request.setReturnUrl(alipayConfig.getReturn_url());AlipayTradePrecreateResponse alipayTradePrecreateResponse = null;try {alipayTradePrecreateResponse = alipayClient.execute(request);} catch (AlipayApiException e) {e.printStackTrace();}assert alipayTradePrecreateResponse != null;QrResponse qrResponse = JSON.parseObject(alipayTradePrecreateResponse.getBody(), QrResponse.class);return qrResponse.getAlipay_trade_precreate_response();}/*** 获取AlipayClient对象*/private AlipayClient getAlipayClient() {return new DefaultAlipayClient(alipayConfig.getGatewayUrl(), alipayConfig.getApp_id(), alipayConfig.getMerchant_private_key(), "JSON", alipayConfig.getCharset(), alipayConfig.getAlipay_public_key(), alipayConfig.getSign_type());} }
更新main.html
<!DOCTYPE html><html lang="en"> <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>kuangstudy-支付宝支付</title><link rel="stylesheet" href="/static/css/main.css"></head> <body data-ext-version="3.1"> <div data-v-7e2550d6="" class="odm_extension image_downloader_wrapper"><!----></div> <!--页面头部--> <nav class="navbar sticky-top navbar-expand-lg navbar-light"><div class="container"><a class="navbar-brand logo" href="https://www.kuangstudy.com/"><img style="width: 112px;" src="https://www.kuangstudy.com//assert/course/c1//index_topleft_logo_black.png" alt=""></a><div class="collapse navbar-collapse position-relative"><ul class="navbar-nav mr-auto"><li class="nav-item position-relative"><a class="nav-link ksd-nav-linknav nav-link-course" href="https://www.kuangstudy.com/course">课程</a><i class="iconfont ksd-bgd-left">免费</i></li><li class="nav-item"><a class="nav-link ksd-nav-linknav nav-link-topics active"href="https://www.kuangstudy.com/bbs">江湖</a></li><li class="nav-item"><a class="nav-link ksd-nav-linknav nav-link-down" href="https://www.kuangstudy.com/app">导航</a></li></ul><div id="ksdloginbox"><div style="position: relative;top:-18px"><div class="tipmessage-box" style="cursor: pointer"><iclass="iconfont iconiconfontunie62c tp1 pr pr-1"></i><spanclass="im-notify ksd-im-number im-number im-center" style="display: none"></span>消息</div><div class="i-frame animated2 fadeInDown"></div><div class="ksd-logindrop show" data-vip="2"><a href="https://www.kuangstudy.com/u" class="ksd-home pr tp2" style="z-index: 11"><iclass="iconfont iconhome pr pr-1"></i>进入主页</a><a class="dropdown-toggle ksd-user-info" href="javascript:void(0);" title="飞哥" data-vip="2"id="navbarDropdown"><span class="pr"><img class="ksd-avatar2 ksd-avatar-img" src="https://www.kuangstudy.com//assert/course/c1//132" alt=""><span class="ksd-iconrenzheng-vip"><img src="https://www.kuangstudy.com//assert/course/c1//vip.png" alt=""></span></span><span class="ksd-text">飞哥</span></a><div class="ksd-login-items"><div class="ksd-header-items mt-3"><ul><li class="ksd-num-items"><a href="https://www.kuangstudy.com/u#topic"><span class="num ksd-num-count6">3</span><span class="ktext">文章</span></a></li><li class="ksd-num-items"><a href="https://www.kuangstudy.com/u#fans"><span class="num ksd-num-count1">7</span><span class="ktext">关注</span></a></li><li class="ksd-num-items"><a href="https://www.kuangstudy.com/u#follow"><span class="num ksd-num-count2">471</span><span class="ktext">粉丝</span></a></li></ul></div><div><div class="citems ksd-sign-items"><a href="javascript:void(0);" data-num="2" class="ksd-user-qiandao"><iclass="iconfont iconsetlocation pr-2 pr tp1"></i><spanclass="ksd-uqtext">签到</span></a></div></div></div><div class="ksd-login-items"><ul><li class="items"><a href="https://www.kuangstudy.com/u" style="width:126px;text-align:left"title="点击前往个人中心" class="fl flitems"><i class="iconfont iconhome"></i>个人中心</a><a href="https://www.kuangstudy.com/vip/pay" title="点击前往订购和续费"class="fr fritems pr"><span class="vipicon fw" style="padding:2px 6px">年会员</span></a></li><li class="items ksdcopylinknum" title="点击复制数字账号" data-clipboard-text="2"><a href="https://www.kuangstudy.com/u/settings" style="width:160px;text-align:left"class="fl ksd-settings2 flitems"><i class="iconfont iconiconzh1"></i>账号</a><a href="javascript:void(0);" class="fr ksd-settings2 fritems">2</a></li><li class="items ksd-exp-itemboxs"><a href="javascript:void(0);" class="fl flitems"><iclass="iconfont icondengji2 tp1 pr"></i>等级</a><a href="javascript:void(0);" class="fr fritems ksd-coin-exp show1"data-exp="74000"><span class="ksd-num-exp">74000</span>exp</a><a href="javascript:void(0);"class="fr fritems show2 ksd-coin-exp ksd-coin-exp-text" data-exp="74000">Lv6</a></li><li class="items"><a href="javascript:void(0);" class="fl flitems"><i class="iconfont iconjinbi"></i>K币</a><a href="javascript:void(0);" class="fr fritems ksd-coin-coin"data-coin="4814887"><spanclass="ksd-coin-cointext ksd-num-coin">4814887</span><spanclass="pr ftp2">币</span></a></li><li class="items" title="订购会员"><a href="https://www.kuangstudy.com/vip/pay" style="text-align:left"class="fl ksd-settings2 flitems"><iclass="iconfont iconVIP_paiban"></i>查看会员权益</a></li><li class="items"><a href="https://www.kuangstudy.com/u/settings" style="width:100%;text-align:left"class="fl flitems"><i class="iconfont iconSettingscontroloptions"></i>个人设置</a></li></ul></div><div class="ksd-login-items bnone"><ul><li class="items"><a href="javascript:void(0);" class="fl flitems ksd-logout"><iclass="iconfont iconai-out"></i>退出登录</a></li></ul></div></div></div></div></div></div> </nav><!--内容区域--> <div id="app" class="container" style="margin-top: 55px;"><h1 class="text-center fz32 mb-5"><ahref="https://www.kuangstudy.com/app/code">笔记下载:https://www.kuangstudy.com/app/code</a></h1><div id="ksd-alert-msg-1" class="alert alert-primary"><button type="button" data-dismiss="alert" class="close">×</button><strong><i class="iconfont icontubiao_xitongtongzhi fz20"></i></strong><span class="pl-2 ccmsg">教程提供者:秦疆(遇见狂神说)、徐成飞(飞哥),作者已授权!Bilibili地址:<ahref="https://space.bilibili.com/95256449" target="_blank">https://space.bilibili.com/95256449</a></span></div><div class="row course-item-wrap"><div class="col-lg-12"><div class="tab-content"><div role="tabpanel" class="tab-pane fade show active"><div class="row"><div class="col-lg-12 text-center"><img :src="'/alipay/pay?courseID='+courseID" alt=""></div></div><div class="row course-block"><div id="courseListBox" class="course_bdleft Mtp25"><div class="course_stage_item"><h2 index="1" id="ksd-title-position-1"class="ksd-title-position-h2"><spanclass="cro_icon1">1</span> <span>第一阶段:JavaSE</span></h2><div class="path-course-r"><div class="row"><div v-for="(course,index) in courseList" class="col-lg-3 col-md-4 col-sm-6 animated fadeInUp delay-1s"><div class="course-item"><div class="course-img "><a:href="'https://www.kuangstudy.com/course/detail/'+course.courseid"target="_blank":title="course.title" class="course__img"><imgheight="140" width="100%":src="'https://www.kuangstudy.com/'+course.img"><span class="num">1</span><span class="stimer">{{course.price}}</span></a></div><div class="course-content"><h3 :title="course.title" class="course__title"><ahref="https://www.kuangstudy.com/course/detail/1317503462556848129"target="_blank" :title="course.title" class="course__img">{{course.title}}</a></h3><p class="course__author">{{course.intro}}</p><div class="course-price-wrap" @click="changePay(index)"><span class="course__btn"><i class="iconfont iconshouye"></i>点击支付</span></div></div></div></div></div></div></div></div></div></div></div></div></div> </div><script src="/static/js/jquery-3.5.1.min.js"></script> <script src="/static/js/vue.min.js"></script> <script src="/static/js/axios.min.js"></script> <script>var vue =new Vue({el:"#app",data:{courseList:[],courseID:'',},created:function () {this.loadCourse();},methods:{loadCourse:function () {var that = this;axios.post("/api/course/list").then(function (res) {console.log("res================>", res);if(res.data.code == 20000){that.courseList = res.data.data.courseList;that.courseID=that.courseList[0].courseid;}})},changePay:function (index) {this.courseID= this.courseList[index].courseid;}}})</script> </body> </html>
更新AlipayController.java
package com.dzy.alipay.web;import com.dzy.alipay.service.AlipayService; import com.dzy.alipay.vo.PayVo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody;@Controller public class AlipayController {private final AlipayService alipayService;public AlipayController(AlipayService alipayService) {this.alipayService = alipayService;}@GetMapping("/alipay/pay")@ResponseBodypublic byte[] alipay(String courseID) {PayVo payVo = new PayVo();payVo.setCourseid(courseID);payVo.setUserId("1");return alipayService.alipay(payVo);} }
进行测试
三、成功截图
生成与产品相关的不同的二维码
支付宝支付 第九集:产品数据和支付二维码对接相关推荐
- 如何从Excel表格导入数据批量生成二维码
目前二维码应用渐趋广泛,二维码具有储存量大.保密性高.追踪性高.抗损性强.备援性大.成本便宜等特性,这些特性特别适用于表单.安全保密.追踪.证照.存货盘点.资料备援等方面.那么我们怎么用条码打印软件从 ...
- 如何从Excel表格导入数据批量生成二维码 1
目前二维码应用渐趋广泛,二维码具有储存量大.保密性高.追踪性高.抗损性强.备援性大.成本便宜等特性,这些特性特别适用于表单.安全保密.追踪.证照.存货盘点.资料备援等方面.那么我们怎么用条码打印软件从 ...
- 微信扫码支付功能(1)---通过谷歌二维码工具生成付款码
生成付款二维码 一.微信网站扫码支付介绍 1.扫码支付文档 微信开发官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5 ...
- JAVA支付宝小程序授权登陆,并生成二维码(证书方式)
接入准备 https://opendocs.alipay.com/open/284/106001?ref=api 根据文档进行创建小程序.配置相关信息(接口加签方式选择证书) 生成二维码文档https ...
- 产品设计:基于二维码与打印业务的校园推广方案
为什么80%的码农都做不了架构师?>>> 另外点子不重要,重要的是执行力,下面是ppt分享,欢迎交流! http://pan.baidu.com/s/1sj7AO2p 转载于: ...
- 支付宝支付二维码显示在商家网站页面,不跳转到支付宝?
如何控制二维码显示在商家电脑网站页面?根据官方文档说明,是可以实现的. 以下段落摘自支付宝官方文档 电脑网站支付本身是调用接口跳转到支付宝收银台页面显示二维码和账户登录方式支付的. 如果需要将该二维码 ...
- 二维码支付的优势与劣势
一.二维码支付概述 1.第三方移动支付定义 第三方移动支付是指交易双方通过手机.平扳电脑等移动终端,利用移动通信网络和无线通信技术,由独立于移动通讯运营商与银行以外的第三方支付平台支持的支付服务,完成 ...
- 银联押宝二维码支付 背后还有一片纷争江湖
昨天银联二维码支付标准正式发布了.这被市场看做,此前存在安全隐患.饱受争议的二维码支付终于合规化了.各位以后去商家扫码,会有不同选择了:支付宝的.微信的.还有银联的.不过我估计各位还是哪个方便.哪个优 ...
- 记一次发现某餐饮企业二维码支付漏洞的经历
背景 如今,移动支付已经成为了主流,无现金支付越来越普遍,我们出门完全不用带纸币,到商店买东西.餐馆吃饭.坐车等都可以用手机支付解决,这给我们带来了很大的便利:我们再也不用担心钱包被偷或者丢掉的问题 ...
最新文章
- 阿里云云原生中间件 2021 年春季校招实习启动啦~
- vue中的nextTick
- mysql ---- innodb-2-索引
- iOS库--.a与.framework
- 协方差公式性质证明过程_论文推荐 | 刘志平:等价条件平差模型的方差-协方差分量最小二乘估计方法...
- c# 对COM+对象反射调用时地址参数处理 c# 对COM+对象反射调用时地址参数处理
- PMP考试技巧(必备)
- 开放源代码_如何使用开放源代码开展业务:热门阅读
- Java读取Properties文件的六种方法
- VS2012+ArcGIS Engine10.2安装教程
- 真Unity3d_分享一个攻击连招的简单实现
- 音视频从入门到精通——FFmpeg之swr_convert音频重采样函数分析
- html中diy的背景怎么透明,自制复古几何无缝纹案背景_html/css_WEB-ITnose
- 科学计数法 与 普通数字 转换
- 工作中使用到的单词(软件开发)_20210317_备份
- dxp全称_DXP元件名字库
- (SETR翻译)Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers
- 阿里mysql面试二面_阿里面试
- 嵌入式系统设计师学习笔记①:数的进制转换
- Inside AbstractQueuedSynchronizer 文档集合
热门文章
- 为什么总线要用一根来表示一bit
- 将一个n元一维向量向左旋转i个位置。例如,当n = 8且i = 3时,向量abcdefgh旋转为defghabc
- 这样是不是就可以预测语音长度和内容了
- Flask中实现数据库的增删改查
- InnoDB的MVCC如何解决幻读
- RhinoMock学习-绑定回调
- POJ 3368	Frequent values 线段树区间合并
- Mandriva学习笔记之八:安装Redis2.2.14
- 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)
- HDFS 2.7.4中hdfs-site.xml参数未配置引发的一些异常