手机H5如何对接支付宝登陆授权以及支付(H5网站支付)

news/2024/5/20 14:51:57/文章来源:https://blog.csdn.net/qq_42394044/article/details/106186276

场景需求:

通过支付宝扫描二维码进入手机H5网站,获取用户唯一标识appid来标识用户以及处理逻辑。一系列操作后,调起支付窗口完成支付宝支付

1、支付宝开放平台配置

1、登陆支付宝开放平台中心,选择“ 网页&移动应用 ”,然后创建一个应用。此时该应用的状态为开发中,需要我们添加一些功能和信息后去审核,审核通过就成了已上线。就可以开始使用了。

在这里插入图片描述
这里我们只需要两项功能:1、手机网站支付;2、用户信息授权
除此之外还需要配置一下开发设置,如下图:
在这里插入图片描述
具体配置可以参照上面官方的文档来。
我这里只配了一个接口加签方式(支付使用),加签方式有两种,一种是普通加签——需要设置支付宝公钥。另一种是证书加签方式。这个有点复杂,看个人需求,具体参照官方文档。
我这里选择普通加签方式,按照官方文档的指示,下载了一个“ 支付宝开放平台开发助手 ” 的软件用来生成相应的应用公钥和应用私钥

在这里插入图片描述
首先,用上面这个工具生成一对密钥,这里叫做应用私钥和应用公钥。我们要做的就是 保存 好这对密钥!!!。普通加签方式就是把这里的应用公钥上传(复制粘贴)到配置里面,然后旁边会有个生成支付宝公钥的按钮,点击生成支付宝公钥。然后把这段支付宝公钥保存下来。跟之前应用私钥和应用公钥一起。后面支付会用到。

接下来就是配置授权回调地址。:这个回调地址就是我们做用户信息授权登陆的时候用到的。这里要配置一个正规的可访问域名。支付宝会检测的。
这里简单介绍一下这个回调地址有什么用。首先我们得知道用户信息授权的流程:用户通过特定规则拼接传输数据到支付宝指定授权地址(url),支付宝校验你传输的数据,通过的话就会给你返回一个auth_code。我们再通过返回过来的auth_code去换取支付宝用户唯一标识appid。拿到这个appid。我们就完成了授权。
上面返回的auth_code就是在支付宝校验我们传输的数据后,会请求我们后台配置的授权回调地址。然后会在url后面带上auth_code
简单来说就是:我们请求支付宝,支付宝通过后会访问我们配置的授权回调地址来将auth_code返回给我们。

配置这一块就结束了。总共配置两个地方:一个加签方式(支付使用),一个授权回调地址(授权使用)。完成后我们就可以提交,等待审核了。(所有功能都必须审核通过才能使用)

用户信息授权

上面我们基本配置了授权所需要的配置,其实就只配置一个授权回调地址来获取返回的auth_code。
先上代码后讲解:
在这里插入图片描述

redirectForAliCode() {goodsApi.getAliSign().then(res => {//授权需要用到开放平台里我们创建应用的appid。不是用户appid。const rr = res.data;const redirectUrl = window.location.href;var result = redirectUrl.match(/=(\S*)#/)[1];var results = result.match(/(\d*)/)[1];let param = 'app_id=' + rrparam += '&scope=auth_base'//可参考文档,因为我们只要授权,所以,这里只写auth_base//下面的redirect_uri值必须经过URLENCODE转义,不能明文传输param += '&redirect_uri=' + encodeURIComponent('http://****.com')//这里写我们后台配置的授权回调地址param += '&state='+results                                //一定要一模一样,否则授权会失败console.log('url:', 'https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?'+ param);window.location.href = 'https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?' + param;//支付宝授权指定url}).catch(err => {})}

通过该代码调用获取auth_code后,我们再通过这个auth_code去换取appid

public Map<String, Object> getPrivateAccessToken(String code) {//之前拿到的auth_codeAlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.URL,//支付宝apialipayConfig.APPID,alipayConfig.RSA_PRIVATE_KEY,alipayConfig.FORMAT,alipayConfig.CHARSET,alipayConfig.ALIPAY_PUBLIC_KEY,alipayConfig.SIGNTYPE);AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();request.setCode(code);request.setGrantType("authorization_code");Map map = Maps.newHashMap();try {AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);logger.info("AccessToken:"+oauthTokenResponse.getAccessToken());logger.info("UserId:"+oauthTokenResponse.getUserId());map.put("AccessToken",oauthTokenResponse.getAccessToken());map.put("UserId",oauthTokenResponse.getUserId());} catch (AlipayApiException e) {//处理异常e.printStackTrace();logger.info("获取userID异常,信息如下:"+e.getErrMsg());}return map;}

通过上面这个代码,可以换取到auth_code。上面创建支付宝api实例的时候有几个参数。
URL:固定请求地址。
APPID:应用appid。
RSA_PRIVATE_KEY:还记得之前保存的应用私钥吗。这里用到了。
FORMAT:格式,只支持json。
CHARSET:编码,只支持UTF-8。
ALIPAY_PUBLIC_KEY:之前配置加签方式保存下来的支付宝公钥
SIGNTYPE:签名类型,固定:RSA2
在这里插入图片描述
至此,我们的appid就拿到了,用户授权信息功能也完成了。接下来就是业务逻辑的一些处理了。(上面授权的这些参数待会支付接口也会用到。)

手机网站支付

下面就到了支付环节了,首先我简单说下支付的大概流程:
我们整理一下订单数据,通过调用支付宝api,然后返回一个form表单,我们再把得到的form表单放到页面上自动提交,就会调起支付密码框,输入密码后就支付完成。

整个支付接口,我分为两个阶段

1、支付准备阶段:

这里最少需要准备两个订单数据字段,一个是我们的业务系统订单号(不可重复哟)。再一个就是支付的金额了(单位是元,最小到分)。

public String aliPay(String orderSn,Double monery){AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.URL,alipayConfig.APPID,alipayConfig.RSA_PRIVATE_KEY,alipayConfig.FORMAT,alipayConfig.CHARSET,alipayConfig.ALIPAY_PUBLIC_KEY,alipayConfig.SIGNTYPE);AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();//支付成功与否回调通知地址request.setNotifyUrl(alipayConfig.notify_url);//支付完成后自动返回的地址(一般为作我们的业务系统自定义的查询是否支付页面)request.setReturnUrl(alipayConfig.return_url+orderSn);request.setBizContent("{" +"\"subject\":\"随便写个名称,用作支付宝后台报表查询标识的\"," +"\"out_trade_no\":\""+orderSn+"\"," +"\"total_amount\":"+monery+"," +"\"product_code\":\"QUICK_WAP_WAY\"" +"  }");AlipayTradeWapPayResponse response = null;try {response = alipayClient.pageExecute(request);//这里会返回一个form表单(调起支付框--这个框就是我们平时用支付宝支付,输密码的框)String result = response.getBody();logger.info(result);return result;} catch (AlipayApiException e) {e.printStackTrace();}if(response.isSuccess()){System.out.println("调用成功");} else {System.out.println("调用失败");}return null;}

这上面构造支付宝api实例的参数跟上面获取授权一样。不同的是支付这里,必须得传一个支付是否成功的回调通知地址,以及一个支付完成后的返回地址。(支付宝这里跟微信jsapi支付不同,是要我们自己将地址传到支付宝后台,由他们来请求我们的地址。)
我们拿到form表单后,把这个表单返回给前台自动提交。

<form name="punchout_form" method="post" action="">
<input type="hidden" name="biz_content" value="{&quot;subject&quot;:&quot;深圳校服&quot;,&quot;out_trade_no&quot;:&quot;20200513085536016569&quot;,&quot;total_amount&quot;:0.01,&quot;product_code&quot;:&quot;QUICK_WAP_WAY&quot;  }">
<input type="submit" value="立即支付" style="display:none" >
</form>
<script>document.forms[0].submit();</script>

生成的form表单大概是这个样子。

aliPrepare(){
//前台传订单号去后台,后台查出订单金额传给支付宝api,返回一个form表单payApi.aliPrepare(this.order.orderNo).then(res => {// 存储微信支付数据datalet data = res.data//返回的form表单console.log("即将跳转支付宝支付,返回的数据为:"+data)const div = document.createElement('div');div.innerHTML = datadocument.body.appendChild(div)document.forms[0].submit();//这些document操作应该不用过多解释了=-=}).catch(err =>{Toast('系统异常,青稍后再试')Toast(err)})},

执行完这个js后就会自动弹出一个支付框啦。支付准备阶段就完成了。

2、支付完成阶段

在我们输入密码完成支付后,(页面):支付宝会请求我们支付的时候传的return_url地址
(后台):支付宝会调用我们传过去的通知回调NotifyUrl地址
如何处理回调通知。官方文档里有demo。这里就不做展示了。
支付宝手机网站demo
我这里由于用的是springboot。所以直接返回即可
在这里插入图片描述

 /*** 支付宝支付回调* @return*/@RequestMapping(value = "ali/notify",method = RequestMethod.POST)public String aliNotify(){logger.info("开始进入支付宝支付的回调,地址:ali/notify");String  msg = aliPayService.resultNotify();logger.info("支付宝回调返回:"+msg);String jsonmes = JSON.toJSONString(msg);logger.info("支付宝回调返回(fast处理):"+jsonmes);return msg;//直接返回success,不要带任何东西,否则会一直回调}

问题一
由于maven中央仓库里没有支付宝的api。所以我们需要手动下载jar。提取码为:gt05
在这里插入图片描述
springboot的话,只需要这一个jar包就可以。
然后自己导入进maven仓库里。具体步骤可以自行百度,将jar打进你本地的maven仓库后就可以正常导入pom文件使用。
pom文件展示:

 <!-- alipay --><dependency><groupId>com.alipay</groupId><artifactId>sdk-java</artifactId><version>4.9.3</version></dependency>

至此,支付宝授权登陆,支付接口就完成了。

实战操作建议配合官方文档一起,便于自己深刻理解。

如对上面有疑问的可以评论留言,看到会解答。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_904420.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站demo

学成教育在线网站demo <style>*{margin: 0;padding: 0;}.w{width: 1200px;margin: auto;}body{background-color: #f3f5f7;}/*清除li前面的原点*/li{list-style: none;}/*ul,li{margin:0; padding:0;}*/a{text-decoration: none;}/*清除浮动&#xff0c;咱也不清楚&#…

大型网站架构演变和知识体系

转自&#xff1a;http://www.phpchina.com/html/40/n-35340.html 之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做…

springboot“传情旧物”网站计算机毕业设计(源码、运行环境)

登录界面 旧物信息 公告信息 首页 本源代码和数据库都放至公众号毕业admin,需要此套源代码可以在公众号里获取。

springboot报价制酒水交易网站计算机毕业设计(源码、运行环境)

登录界面 商家界面 商品信息 商家注册界面 首页 本源代码和数据库都放至公众号毕业admin,需要此套源代码可以在公众号里获取。

jsp重庆美食网站计算机毕业设计(源码、运行环境)

登录界面 用户管理 美食类型管理 首页界面 美食信息 本源代码和数据库都放至公众号毕业admin,需要此套源代码可以在公众号里获取。

java小区失物招领网站计算机毕业设计(源码、运行环境)

登录界面 论坛交流管理 注册界面 失物展示管理 论坛信息 本源代码和数据库都放至公众号毕业admin,需要此套源代码可以在公众号里获取。

java/php/net/python家教信息网站设计

本系统带文档lw万字以上+答辩PPT+查重 如果这个题目不合适,可以去我上传的资源里面找题目,找不到的话,评论留下题目,或者站内私信我, 有时间看到机会给您发 系统体系结构 家教信息网站 结构图4-1所示: 图4-1 系统结构模块包括主界面,首页、个人中心、系统管理、管理员…

java/php/net/python二手手机回购网站设计

本系统带文档lw万字以上+答辩PPT+查重 如果这个题目不合适,可以去我上传的资源里面找题目,找不到的话,评论留下题目,或者站内私信我, 有时间看到机会给您发 1管理员用例 管理员登录后可进行首页、个人中心、会员管理、类型信息管理、系统管理、手机信息管理、手机估价管…

静和动态网站访问的流程

ip ip就是像127.0.0.1这些比较长的数字组成的东西&#xff0c;很难记住 【注】&#xff1a;由于ip太难记住了所以有了域名 域名&#xff1a; 比如百度&#xff1a;www.baidu.com、淘宝&#xff1a;。。。 这些都是容易记住的名字 DNS: 这货听着很高大上&#xff0c;我第一次也…

记录值得推荐的几本编程入门书和网站

1.Data structure & Algorithm in Java&#xff08;通俗易懂&#xff0c;很适合初学者&#xff09; 2. 嵌入式操作系统基础μC/OS-II和Linux&#xff08;通俗易懂&#xff0c;很适合初学者&#xff09; 3. 图解TCP/IP 协议&#xff08;通俗易懂&#xff0c;很适合初学者&am…

大型网站技术架构-入门梳理

大型网站技术架构-入门梳理 标签 &#xff1a; 架构设计 大型网站技术架构-入门梳理 前言概述 演化历程架构模式核心要素 架构 高性能高可用伸缩性可扩展网站的安全架构 罗列了大型网站架构涉及到的概念&#xff0c;附上了简单说明 前言 本文是对《大型网站架构设计》(李智…

VS2012 WEB网站项目,出现需要“jquery”ScriptResourceMapping”的错误

异常详细信息: System.InvalidOperationException: WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。 具体步骤如下图所示&#xff1a; 该dll文件的目录为&#xff1a; C:\Program F…

PHP开发一个网站

PHPer应具备的知识 1&#xff0c;php知识 熟练掌握基础函数&#xff0c;PHP语句&#xff08;条件&#xff0c;循环&#xff09;&#xff0c;数组&#xff08;排序&#xff0c;读取&#xff09;&#xff0c;函数&#xff08;内部&#xff0c; 构造&#xff09;&#xff0c;运算…

课程作业2-大一纯网页课程作业——垃圾分类网站设计

“垃圾分类网”项目文档 源码地址&#xff1a; https://download.csdn.net/download/weixin_41446786/12358553 一、 项目概述 1、 设计思路 本次网页设计主题是以宣传垃圾分类为主题&#xff0c;因此秉着平台需要突出宣传垃圾分类、提高垃圾分类意识的想法&#xff0c;网页…

“花生壳”实现内网穿透搭建个人网站

我们先简单介绍一下内网穿透&#xff0c;也叫 NAT 穿透&#xff0c;进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机&#xff0c;在目前国内的内网穿透工具很多&#xff0c;比如花生壳、Ngrok、网云穿、Frp等等可能介绍…

亿级用户流量网站如何统计活跃用户?妙用redis中bitMap

BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte&#xff0c;所以bitmap本身会极大的节省储存空间。你可以把它理解为一个特殊处理过的 字符串&#xff0c;key代表业务属性、标签。一个 bit 位来表…

推荐3个搜索资源的网站,保存起来,用的时候方便找哦

互联网是一个自由分享的世界&#xff0c;但一旦真想找点资源又不容易找&#xff0c;一方面是现在有违规资源会被封&#xff0c;一方面信息时代信息爆炸&#xff0c;很难快速找到想要的内容。 今天分享3个网站&#xff0c;都可以搜索资源&#xff0c;是资源搜索的入口。 找到了…

自学《HTML5+CSS 32网站设计基础教程》 第一章

第一章 初始HTML 5 1.1 HTML5 概述1.1.1 HTML5发展历程1.1.2 HTML5的优势1.1.3 HTML5浏览器支持情况1.1.4 创建第一个HTML5页面 1.2 HTML5 基础1.2.1 HTML5文档基本格式1.标记2.< html >标记3.< head >标记4.< body >标记 1.2.2 HTML5语法1.2.3 HTML标记1.单…

验证码识别产生的神奇网站

验证码识别与反识别技术,矛和盾的关系,但是验证码终归还是要让人看清楚其内容, 完全靠软件识别分析是太难,0和o ,O和0 ,9和g,I和1,I和l,l和1,在不同字体下和变形情况下匹配, 用软件识别出来可能吗? 2013年末, 在春运网络抢票前, 中国出现了一个神奇的网站石像答题网(http:…

一步一步教你抓数据——用.net精确提取网站数据的通用方法

具体实现思路&#xff1a;1 首先用WebClient类下载网页源码 public static string DownLoadHtml( string url) { string output ""; Encoding encode Encoding.Default; WebClient webclient new WebClient(); …