首先我们需要完成支付宝账号注册,支持的账号类型:支付宝企业账号、支付宝个人账号、个体工商户。

            到支付宝商家平台 产品中心开通APP支付、手机网站支付、电脑网站支付的产品权限。

            一、电脑PC网站接入

            电脑PC网站支付是指商户在电脑网页展示商品或服务,用户在商户页面确认使用支付宝支付时,浏览器自动跳转支付宝电脑网页完成付款的支付产品。

         签约申请提交材料要求如下:

    • 提供网站地址,网站能正常访问且页面显示完整,网站需要明确经营内容且有完整的商品信息。
    • 网站必须通过 ICP 备案,且备案主体需与支付宝账号主体一致。若网站备案主体与当前账号主体不同时需上传授权函。
    • 如以个人账号申请,需提供营业执照,且支付宝账号名称需与营业执照主体一致。

            1、登录支付宝开放平台创建 网页/移动应用。应用类型选择网页应用,填入应用访问的网站地址。 

       

            2、配置接口加签方式、应用网关,详见接入准备。

            需要注意应用网关:用于接收支付宝异步通知消息,需要传入 http(s) 公网地址。不设置的话无法接受异步通知。支付宝网关地址:开发者调用 OpenAPI 发送 http(s) 请求的目标地址,需配置在AlipayClient中。

            3、网页/移动应用:需要手动上线。提交审核后,预计 1 个工作日的审核时间。

            4、绑定商家账号

            在支付宝开放平台创建的应用归属于对应的开放平台账号。如果要在应用中使用支付和资金等相关产品,需要将应用和支付宝商家平台账号绑定,应用才可调用需要商家开通的产品。

            5、集成支付宝SDK

            <dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.40.308.ALL</version></dependency>

            6、支付配置

            7、接入 统一收单下单并支付页面接口

            可以参考示例代码编写自己的代码:

    package com.ynfy.buss.mall.pay.service.alipay._native.impl;import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    import com.alipay.api.domain.AlipayTradePagePayModel;
    import com.alipay.api.request.AlipayTradePagePayRequest;
    import com.alipay.api.response.AlipayTradePagePayResponse;
    import com.ynfy.buss.mall.pay.service.alipay._native.INativePayService;
    import com.ynfy.common.utils.HttpUtils;
    import lombok.extern.slf4j.Slf4j;
    import org.jeecg.common.exception.JeecgBootException;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;import java.math.BigDecimal;/*** 支付宝电脑网站支付** @author yangfeng* @since 2020/12/21 17:44*/
    @Slf4j
    @Component
    public class AliNativePayServiceImpl implements INativePayService {/*** app的id*/@Value("${alipay.wapAppId}")private String wapAppId;/*** 私钥*/@Value("${alipay.privateKey}")public String privateKey;/*** 公钥*/@Value("${alipay.publicKey}")public String publicKey;/*** 支付回调地址*/@Value("${alipay.notifyUrl}")String notifyUrl;/*** 网关地址*/@Value("${alipay.serverUrl}")String serverUrl;@Overridepublic Object pay(String orderSn, BigDecimal price, String description) {AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, wapAppId, privateKey, "json", "UTF-8", publicKey, "RSA2");AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();AlipayTradePagePayModel model = new AlipayTradePagePayModel();model.setBody(description);model.setSubject(description);model.setOutTradeNo(orderSn);model.setProductCode("FAST_INSTANT_TRADE_PAY");// 设置PC扫码支付的方式model.setQrPayMode("1");// 设置请求后页面的集成方式model.setIntegrationType("PCWEB");model.setTimeoutExpress("30m");model.setTotalAmount(price.toString());request.setBizModel(model);request.setNotifyUrl(notifyUrl);try {AlipayTradePagePayResponse response = alipayClient.pageExecute(request, "GET");return response.getBody();} catch (Exception e) {throw new JeecgBootException("支付宝电脑网站统一下单接口报错:" + HttpUtils.getErrorMsgFromWxPay(e.getMessage()));}}}
    

            8、iframe嵌入上述接口返回的连接,展示在自己的支付页面中。效果如下图:

            用户支付完成后,触发回调通知,根据支付结果更新订单状态。回调接口代码:

     @IgnoreAuth@ApiLog(value = "支付宝支付回调")@PostMapping("aliPayCallback")public Object aliPayCallback() throws Exception {log.info("支付宝支付回调通知...");//获取支付宝POST过来反馈信息,将异步通知中收到的待验证所有参数都存放到map中Map<String, String> params = new HashMap<>();Map<String, String[]> requestParams = request.getParameterMap();for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {String name = iter.next();String[] values = requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";}//乱码解决,这段代码在出现乱码时使用。//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}//调用SDK验证签名//公钥验签log.info("支付宝支付回调返回参数:{}", params);boolean signVerified = AlipaySignature.rsaCheckV1(params, publicKey, "UTF-8", "RSA2");if (signVerified) {log.info("支付宝支付验签成功...");List<PurchaseOrder> updateOrderList = new ArrayList<>();// 验签成功后// 获取支付结果参数String tradeStatus = request.getParameter("trade_status");log.info("支付宝支付回调交易状态:{}", tradeStatus);String outTradeNo = request.getParameter("out_trade_no");log.info("支付宝支付回调订单号:{}", outTradeNo);String gmtPayment = request.getParameter("gmt_payment");// 根据支付结果参数处理业务逻辑if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) {// 更新订单状态为支付成功orderService.updateOrderPayCallback(updateOrderList, CommonConstant.PAY_METHOD_ALI, outTradeNo, true, gmtPayment);log.info("支付宝支付回调通知处理完成,共更新{}个订单", updateOrderList.size());return "success";} else {// 更新订单状态为支付失败orderService.updateOrderPayCallback(updateOrderList, CommonConstant.PAY_METHOD_ALI, outTradeNo, false, null);return "fail";}}log.info("支付宝支付验签失败...");return "fail";}

            然后在页面中定时器监听订单状态,通知用户支付是否成功。

            二、uniapp手机网站(H5)接入支付

            手机网站支付是指商家在移动端网页展示商品或服务,用户在商家页面确认使用支付宝支付后,浏览器自动跳转支付宝 App 或支付宝网页完成付款的支付产品。

            1、登录支付宝开放平台创建 网页/移动应用,这里的应用类型也是网页应用,可以和上面的PC网页应用共享,所以不用再创建。

            2、接入 手机网站支付接口2.0

            可以参考示例代码编写自己的代码:

    package com.ynfy.buss.mall.pay.service.alipay.h5.impl;import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    import com.alipay.api.domain.AlipayTradeWapPayModel;
    import com.alipay.api.request.AlipayTradeWapPayRequest;
    import com.alipay.api.response.AlipayTradeWapPayResponse;
    import com.ynfy.buss.mall.pay.service.alipay.h5.IH5PayService;
    import com.ynfy.common.utils.HttpUtils;
    import lombok.extern.slf4j.Slf4j;
    import org.jeecg.common.exception.JeecgBootException;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;import java.math.BigDecimal;/*** 支付宝H5支付** @author yangfeng* @since 2020/12/21 17:44*/
    @Slf4j
    @Component
    public class AliH5PayServiceImpl implements IH5PayService {/*** app的id*/@Value("${alipay.wapAppId}")private String wapAppId;/*** 私钥*/@Value("${alipay.privateKey}")public String privateKey;/*** 公钥*/@Value("${alipay.publicKey}")public String publicKey;/*** 支付回调地址*/@Value("${alipay.notifyUrl}")String notifyUrl;/*** 网关地址*/@Value("${alipay.serverUrl}")String serverUrl;@Overridepublic Object pay(String orderSn, BigDecimal price, String description) {AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, wapAppId, privateKey, "json", "UTF-8", publicKey, "RSA2");// 构造请求参数以调用接口AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();model.setSubject(description);model.setOutTradeNo(orderSn);// 设置产品码model.setProductCode("QUICK_WAP_WAY");model.setTimeoutExpress("30m");model.setTotalAmount(price.toString());request.setBizModel(model);request.setNotifyUrl(notifyUrl);try {AlipayTradeWapPayResponse response = alipayClient.pageExecute(request, "GET");return response.getBody();} catch (Exception e) {throw new JeecgBootException("支付宝h5统一下单接口报错:" + HttpUtils.getErrorMsgFromWxPay(e.getMessage()));}}}
    

                   3、uniapp调用上述支付接口,跳转返回的链接页面代码:

    
    /*** 支付* @param response*/
    export function payment(response, clientType) {//app端需要判断操作系统是否为华为鸿蒙// #ifdef APP-PLUSif (isHarmonyOS()) {uni.showToast({icon: "none",title: "鸿蒙暂不可支付",});return}// #endifconst provider = clientType == 'WxPay' ? "wxpay" : clientType == 'AliPay' ? 'alipay' : '';if (!provider) {uni.showToast({icon: "none",title: "支付方式缺失",});return}//app微信支付 orderInfo为json对象//app支付宝支付 orderInfo为字符串,https://uniapp.dcloud.net.cn/tutorial/app-payment-alipay.htmllet orderInfo = null;if (provider == "wxpay") {orderInfo = {appid: response.appid,noncestr: response.nonceStr,package: response.packageVal,partnerid: response.partnerId,prepayid: response.prepayId,timestamp: response.timestamp,sign: response.sign}} else if (provider == "alipay") {orderInfo = response}uni.requestPayment({provider: provider,// #ifdef APP-PLUSorderInfo: orderInfo,// #endif// #ifdef MP-WEIXINtimeStamp: response.timeStamp,nonceStr: response.nonceStr,package: response.packageVal,signType: response.signType,paySign: response.paySign,// #endifsuccess: (e) => {uni.showToast({icon: "none",title: "支付成功!",});setTimeout(() => {uni.navigateTo({url: "/subpages/myorder/myorder"})}, 1000)},fail: (e) => {uni.showModal({title: "支付失败",content: "如果您已支付,请勿反复支付",showCancel: false,success: () => {uni.redirectTo({url: "/subpages/myorder/myorder?orderStatus=0",});},});},});
    }export function isHarmonyOS() {const sysInfo = uni.getSystemInfoSync();// 检查版本号是否包含"HarmonyOS"或"10+"等标识return /(10\+|\+HarmonyOS)/.test(sysInfo.system);
    }// 去支付
    export async function goPay(orderSn, clientType) {const orderData = await apiGetOrder(orderSn);const payParams = {clientType: clientType,// #ifdef MP-WEIXINpaymentType: "MP",// #endif// #ifdef H5paymentType: "H5",// #endif// #ifdef APP-PLUSpaymentType: "APP",// #endifprice: orderData.orderPrice,orderSn: orderSn,description: orderData.orderTitle};const response = await apiPay(payParams);// #ifdef MP-WEIXIN || APP-PLUSpayment(response, clientType)// #endif// #ifdef H5if (clientType == 'WxPay') {window.location.href = response.h5Url} else if (clientType == 'AliPay') {window.location.href = response}// #endif
    }

             4、打开支付宝APP完成付款。效果如下:

            三、uniapp安卓 APP支付

            APP支付是指商家在商家移动端 App 中集成支付宝 SDK,调起支付宝来完成付款的一种支付产品。适用于在商家移动端 App 内使用支付宝支付功能的场景。

         签约申请提交材料要求如下:

    • 如应用已上架,需提供应用名称和已上架的应用市场;若应用未上架,需提供 Demo 或产品说明文档。
    • 应用必须包含明确的经营内容和价格信息;且经营内容须与营业执照经营范围一致。
    • 如应用开发者与支付宝账号名称不一致需提供开发者授权函。
    • 个人账号申请,需提供营业执照,且支付宝账号名称需与营业执照主体一致。

            1、登录 支付宝开放平台,点击创建 网页/移动应用。(仅支持应用类型为 移动应用 接入)。

         2、配置接口加签方式、应用网关,详见接入准备。 

            3、网页/移动应用:需要手动上线。提交审核后,预计 1 个工作日的审核时间。

            4、绑定商家账号

            在支付宝开放平台创建的应用归属于对应的开放平台账号。如果要在应用中使用支付和资金等相关产品,需要将应用和支付宝商家平台账号绑定,应用才可调用需要商家开通的产品。

            5、接入 app支付接口2.0

            可以参考示例代码编写自己的代码:

    package com.ynfy.buss.mall.pay.service.alipay.app.impl;import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    import com.alipay.api.domain.AlipayTradeAppPayModel;
    import com.alipay.api.request.AlipayTradeAppPayRequest;
    import com.alipay.api.response.AlipayTradeAppPayResponse;
    import com.ynfy.buss.mall.pay.service.alipay.app.IAppPayService;
    import com.ynfy.common.utils.HttpUtils;
    import lombok.extern.slf4j.Slf4j;
    import org.jeecg.common.exception.JeecgBootException;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;import java.math.BigDecimal;/*** 支付宝APP支付** @author yangfeng* @since 2020/12/21 17:44*/
    @Slf4j
    @Component
    public class AliAppPayServiceImpl implements IAppPayService {/*** app的id*/@Value("${alipay.appAppId}")private String appId;/*** 私钥*/@Value("${alipay.privateKey}")public String privateKey;/*** 公钥*/@Value("${alipay.publicKey}")public String publicKey;/*** 支付回调地址*/@Value("${alipay.notifyUrl}")String notifyUrl;/*** 网关地址*/@Value("${alipay.serverUrl}")String serverUrl;@Overridepublic Object pay(String orderSn, BigDecimal price, String description) {AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, "json", "UTF-8", publicKey, "RSA2");AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();model.setSubject(description);model.setOutTradeNo(orderSn);// 设置产品码model.setProductCode("QUICK_MSECURITY_PAY");model.setTimeoutExpress("30m");model.setTotalAmount(price.toString());request.setBizModel(model);request.setNotifyUrl(notifyUrl);try {//这里和普通的接口调用不同,使用的是sdkExecuteAlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);return response.getBody();} catch (Exception e) {throw new JeecgBootException("支付宝APP统一下单接口报错:" + HttpUtils.getErrorMsgFromWxPay(e.getMessage()));}}}
    

             6、uniapp调用上述接口,调起支付宝支付控件。效果如图:

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

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

    相关文章

    MCU芯片内部的ECC安全机制

    MCU&#xff08;微控制器单元&#xff09;芯片内部的 ECC&#xff08;错误检测与纠正&#xff09;安全机制 是一种至关重要的硬件级可靠性技术&#xff0c;主要用于保护关键存储单元&#xff08;如 SRAM、Flash、Cache&#xff09;中的数据完整性&#xff0c;防止因外部干扰或硬…

    【自动驾驶】经典LSS算法解析——深度估计

    LSS-Lift.Splat,Shoot 论文题目&#xff1a;Lift, Splat, Shoot: Encoding Images From Arbitrary Camera Rigs by Implicitly Unprojecting to 3D 代码&#xff1a;https://github.com/nv-tlabs/lift-splat-shoot 概括&#xff1a;先做深度估计和特征融合&#xff0c;然后投…

    《【第八篇-图片总结篇】Python图片处理自动化:终极工厂!从裁剪压缩到智能加水印,打造你的视觉内容生产流水线!》

    在数字时代&#xff0c;图片无处不在。然而&#xff0c;高质量的图片背后&#xff0c;往往隐藏着繁琐的后期处理&#xff1a;图片文件太大导致加载慢&#xff1b;尺寸不符需要裁剪&#xff1b;版权保护要加水印&#xff1b; 为了兼容性还得批量转换格式……这些重复、机械的工…

    frame 与新窗口切换操作【selenium 】

    &#x1f9ed; 一、切换到 iframe 内部进行操作在浏览器自动化测试中&#xff0c;iframe 是一个特别的存在。它相当于在当前页面中嵌入了另一个独立的 HTML 页面。当我们试图直接访问 iframe 中的元素时&#xff0c;往往会发现定位不到&#xff0c;比如&#xff1a;elements w…

    MYSQL C_API使用全解

    文章目录C_API&#xff08;简单的&#xff09;安装这个库使用流程初始化连接mysql_init建立连接mysql_real_connect执行SQL语句mysql_query处理结果mysql_store_resultmsyql_use_resultmysql_num_rowsmsyql_free_resultmysql_num_fieldsmysql_fetch_row多线程安全关闭连接mysql…

    闲庭信步使用图像验证平台加速FPGA的开发:第二课——RGB转YCbCr的FPGA硬件编程详解

    &#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程文件请关注…

    RK3566/RK3568 Android11 修改selinux模式

    概述RK3566/RK3568 Android11 SDK默认的selinux是Enforcing模式(强制模式)。Enforcing&#xff1a;强制模式&#xff1a;SELinux在运行中&#xff0c;且已经开始限制domain/type之间的验证关系 Permisssive&#xff1a;宽容模式&#xff1a;SELinux在运行中&#xff0c;如果验证…

    iOS Widget 开发-3:Widget 的种类与尺寸(主屏、锁屏、灵动岛)

    iOS 支持多种类型的 Widget&#xff0c;分布在主屏幕、锁屏、灵动岛、待机模式、控制中心等多个系统位置。每种 Widget 都有各自的尺寸、交互能力与限制。 本篇将系统梳理 iOS 当前支持的 Widget 类型与尺寸规格。主屏 Widget&#xff08;Home Screen Widgets&#xff09; 主屏…

    ffmpeg 中 write_option()函数详细注释

    author: hjjdebug date: 2025年 07月 11日 星期五 10:51:23 CST descrip: ffmpeg 中 write_option()函数详细注释 文章目录1. 函数原型1.1 参数说明1.2 SpecifierOpt 说明符选项结构2. write_option 代码注释2.1 谁调用了write_option 函数?3. 小结:write_option()不仅在ffmpe…

    PandaCoder重大产品更新-引入Jenkinsfile文件支持

    写在前面 安装这个插件可以直接平替 Jenkinsfile Pro &#xff0c;节省200元关于插件介绍的处女篇&#xff1a;https://mp.weixin.qq.com/s/fwMEhmx8vxVlvfnipx09Ag为什么叫「熊猫编码助手」&#xff1f; 熊猫是中国的国宝&#xff0c;备受世界喜爱&#xff0c;代表着中国特色和…

    链表算法之【判断链表中是否有环】

    目录 LeetCode-141题 LeetCode-141题 给定一个链表的头节点&#xff0c;判断链表中是否存在环 class Solution {public boolean hasCycle(ListNode head) {// checkif (head null || head.next null)return false;// 定义两个指针&#xff0c;一个快指针[fast]&#xff0c…

    Ubuntu 22.04安装SQL Server指南

    看起来在安装过程中出现了问题&#xff0c;导致 mssql-server 没有正确安装。以下是排查和修复步骤&#xff1a;1. 检查是否成功安装了 mssql-server 运行以下命令&#xff0c;确认是否已安装&#xff1a; dpkg -l | grep mssql-server如果没有任何输出&#xff0c;说明 mssql-…

    Vue+ElementUI聊天室开发指南

    Hi&#xff0c;我是布兰妮甜 &#xff01;在现代Web应用中&#xff0c;实时聊天功能已成为许多社交平台、协作工具和客户支持系统的核心需求。本文将详细介绍如何使用Vue.js框架配合ElementUI组件库实现一个功能完整的聊天室应用。我们将从项目搭建开始&#xff0c;逐步实现用户…

    提升你的AI交互技能:使用Anthropic互动提示教程

    探索Anthropic的互动式提示工程教程&#xff1a;让Claude与你更默契 在当今人工智能世界中&#xff0c;熟练掌握有效的提示工程成为了与AI进行高效沟通的关键。Anthropic推出了一款全面且互动性强的教程&#xff0c;名为“Prompt Engineering Interactive Tutorial”&#xff0…

    从 JavaFX WebView 迁移至 JxBrowser

    长久以来&#xff0c;JavaFX 一直包含一个内置的 WebView 组件&#xff0c;这是在 Java 应用中渲染 Web 内容的一个稳定方案。然而&#xff0c;在更复杂或要求更高的使用场景中&#xff0c;它可能就不够用了。因此&#xff0c;许多开发者转向了像 JxBrowser 这样的替代方案。 …

    将 Go 应用从 x86 平台迁移至 Amazon Graviton:场景剖析与最佳实践

    简介 近年来&#xff0c;Amazon Graviton 处理器以其优越的性价比和强劲的性能&#xff0c;成为了构建高效、可扩展云原生应用的重要选择。Graviton 采用基于 Arm64 架构的芯片&#xff0c;与传统的 x86 架构相比存在不少架构差异。虽然 Go 天生对 Arm64 具有良好支持&#xf…

    arcgis api for js 设置地图服务请求带有请求头信息

    通过地图的config模块的请求拦截器来设置请求头信息&#xff0c;如下示例&#xff1a; 1、引入&#xff1a;‘esri/config’ 1、设置请求头信息 import { loadArcgisModules } from /utils/map/mapLoadUtil export default { mounted() {this.loadMap()}, methods: {/** ****…

    工业通信升级新选择:耐达讯CCLINKIE转Modbus TCP网关

    在工业自动化系统中&#xff0c;协议转换网关的选择直接影响系统稳定性与通信效率。对于CCLINKIE转Modbus TCP场景&#xff0c;耐达讯通信技术网关凭借以下特性&#xff0c;成为多个项目中的优选方案。技术选型要点协议兼容性支持CCLINKIE的令牌环机制与Modbus TCP的TCP/IP协议…

    使用python的 FastApi框架开发图书管理系统-前后端分离项目分享

    今天给大家分享一个 我最近使用python 框架 fastapi 写的一个web项目 &#xff0c;叫图书管理系统。项目主要是来巩固 python的编程技术。使用的是前端后 分离开发。 主要实现的功能&#xff1a; 1、用户管理&#xff1a;可以新增、编辑、删除用户信息。 2、图书管理&#xff1…

    上位机知识篇---Docker

    Docker 详细介绍 一、Docker 是什么 Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序及其依赖项打包到一个标准化的单元&#xff08;称为容器&#xff09;中&#xff0c;确保应用在任何环境中都能以相同的方式运行。 简单来说&#xff0c;Docker 解决了 &…