针对支付宝-当面付实现的个人支付

news2024/10/7 16:17:23

测试地址

项目背景

为什么想做这个 一是工作中也接触到了支付宝,微信支付方面,二是自己也想弄个收费服务,比如之后做的程序想收费可以直接让用户扫码支付,而不用微信交流了。

了解什么支付适合个人支付

微信支付:需要营业执照,个人不好弄,所以放弃。

支付宝手机支付:大多也需要营业执照,个人不好弄,所以放弃。

爬虫和监听收款手机信息:操作太复杂,爬虫好像说也容易被封,放弃。

支付宝当面付,暂时可以支持个人不需要营业执照,只需要店面图片即可,所以了解到这,直接开搞。

开通支付宝当面付流程

开通 当面付(点击下方链接开通)

开通 当面付

  • 填写相关资料
  1. 经营类目 选择 “百货零售 / 其他零售 / 杂货店”,或者其他…问题不大
  2. 营业执照 可不上传
  3. 店铺招牌 可以拍一下身份的百货店,或者百度找一张类似的图
  • 等待审核(工作日的话大概30分钟,非工作日就不好说了)

创建应用并且添加支付能力

可以参考官方文档:(或者按照我的步骤下面步骤)

创建应用

创建应用(点击链接进入)

open.alipay.com/platform/de…

创建应用

填写相关应用资料

  • 应用名称
  • 应用图标

应用 添加能力

添加能力

应用 开发设置

  1. 设置 接口加签方式,手机收到验证码填写
  2. 下载 支付宝开放平台开发助手即密钥生成工具 opendocs.alipay.com/open/291/in…

支付宝开放平台开发助手即密钥生成工具

  1. 上传刚才生成的应用公钥

上传刚才生成的应用公钥

  1. 点击保存上传的应用公钥之后,会弹窗给出支付宝的公钥

支付宝的公钥

  1. 设置应用网关等

设设置应

应用 提交审核

审核一般一天左右,运气好半天就可以

提交审核

开始写代码

当面付,我总结流程就分两步,1. 获取支付二维码,2. 支付回调。

获取支付二维码

public String preCreateOrder(AliPayInfo aliPayInfo) throws AlipayApiException {
        AlipayClient alipayClient = aliPayBusinessConfig.getAlipayClient();
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        request.setNotifyUrl("https://ggball.top/notify/ali/pay/face/notify");
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", aliPayInfo.getOutTradeNo());
        bizContent.put("total_amount", aliPayInfo.getTotalAmount());
        bizContent.put("subject", aliPayInfo.getSubject());

 商品明细信息,按需传入
//JSONArray goodsDetail = new JSONArray();
//JSONObject goods1 = new JSONObject();
//goods1.put("goods_id", "goodsNo1");
//goods1.put("goods_name", "子商品1");
//goods1.put("quantity", 1);
//goods1.put("price", 0.01);
//goodsDetail.add(goods1);
//bizContent.put("goods_detail", goodsDetail);

 扩展信息,按需传入
//JSONObject extendParams = new JSONObject();
//extendParams.put("sys_service_provider_id", "2088511833207846");
//bizContent.put("extend_params", extendParams);

 结算信息,按需传入
//JSONObject settleInfo = new JSONObject();
//JSONArray settleDetailInfos = new JSONArray();
//JSONObject settleDetail = new JSONObject();
//settleDetail.put("trans_in_type", "defaultSettle");
//settleDetail.put("amount", 0.01);
//settleDetailInfos.add(settleDetail);
//settleInfo.put("settle_detail_infos", settleDetailInfos);
//bizContent.put("settle_info", settleInfo);

 二级商户信息,按需传入
//JSONObject subMerchant = new JSONObject();
//subMerchant.put("merchant_id", "2088000603999128");
//bizContent.put("sub_merchant", subMerchant);

 业务参数信息,按需传入
//JSONObject businessParams = new JSONObject();
//businessParams.put("busi_params_key", "busiParamsValue");
//bizContent.put("business_params", businessParams);

 营销信息,按需传入
//JSONObject promoParams = new JSONObject();
//promoParams.put("promo_params_key", "promoParamsValue");
//bizContent.put("promo_params", promoParams);

        request.setBizContent(bizContent.toString());
        AlipayTradePrecreateResponse response = alipayClient.execute(request);
        if(response.isSuccess()){
            System.out.println("调用成功");
            log.info("res:{}",response.getBody());

            JSONObject jsonObject = JSONObject.parseObject(response.getBody());
            return jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code");

        } else {
            log.error("res:{}",response.getBody());
            System.out.println("调用失败");
            return "";
        }
    }

如果在本地測試的話,可以使用钉钉给的免费的内网穿透工具,这里我是使用自己的服务,frp内网穿透到本地的。回调地址一定是公网能够访问到的域名,要不然回调会失败。

支付回调

@PostMapping ("/notify")
    public String preOrderNotify(HttpServletRequest request) throws AlipayApiException {
        //获取支付宝POST过来反馈信息,将异步通知中收到的待验证所有参数都存放到map中
        Map<String, String> params = new HashMap<String, String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
            String name = (String) iter.next();
            String[] values = (String[]) 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);
        }
        log.info("params:{}",params);



        //调用SDK验证签名
        //公钥验签示例代码
        boolean signVerified = AlipaySignature.rsaCheckV1(params, aliPayBusinessConfig.getPublicKey(), aliPayBusinessConfig.getCharset(), aliPayBusinessConfig.getSignType());
        //公钥证书验签示例代码
        //   boolean flag = AlipaySignature.rsaCertCheckV1(params,alipayPublicCertPath,"UTF-8","RSA2");

        PayBill oldPayBill = payBillService.getPayBillByNotifyId(params.get("notify_id"));
        if (null != oldPayBill) {
            return "success";
        } else if (signVerified) {
            // TODO 验签成功后
            PayBill payBill = new PayBill();
            payBill.setOrderNum(params.get("out_trade_no"));
            payBill.setIsPay(true);
            payBill.setNotifyId(params.get("notify_id"));
            payBill.setPayerId(params.get("buyer_id"));
            payBill.setSellerEmail(params.get("seller_email"));
            payBill.setSellerId(params.get("seller_id"));
            payBill.setTradeNo(params.get("trade_no"));
            payBill.setBuyerLogonId(params.get("buyer_logon_id"));
            PayBill newPayBill = payBillService.updatePayBill(payBill);

            // push queue
            try {
                QueueCore<PayBill> billQueueCore = new QueueCore<>("NOTIFY_JOB");
                billQueueCore.get("NOTIFY_JOB").push(newPayBill);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            return "success";
            //按照支付结果异步通知中的描述,对支付结果中的业务内容进行1\2\3\4二次校验,校验成功后在response中返回success
        } else {
            // TODO 验签失败则记录异常日志,并在response中返回fail.
            return "fail";
        }

    }

這里是支付宝提供的代码,验签失败和成功可以添加自己的逻辑代码,这里我是将结果放在队列里,为了后续将数据保存到数据库,将支付结果通知给我的其他服务等等。

测试截图

image-20221128231305902

image-20221128231336632

测试地址

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的实习管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#…

Unity与IOS⭐Xcode打包,上架TestFlight的完整教程

文章目录 🟥 本章注意事项1️⃣ 证书及Archive2️⃣ 更新版本及加密规则🟧 Xcode打包出ipa文件🟨 将ipa上传到App Store Connect🟥 本章注意事项 1️⃣ 证书及Archive 上架TestFlight需要苹果企业版证书,而不是个人版证书。Archive时必须插上手机,否则会失败。2️⃣…

Prometheus 采集rabbitmq监控数据

Prometheus采集主机监控参考部署下载&#xff0c;图形生成 系统安装Grafana downloadWindows参考图形生成参考win_exporterLinux参考node_exporterMysql参考Mysql_exporterSQL Server参考SQL exporterRedis 参考Redis_exportercadvisor参考cadvisorrabbitmq参考参考rabbitmq s…

众多互联网公司都在用的Elasticsearch还不会?熬夜整理基于 Elasticsearch 7.x 版本的核心知识学习手册,值得拥有!

简介 简单来说 ElasticSearch 就是一个搜索框架。对于搜索这个词我们并不陌生&#xff0c;当我们输入关键词后&#xff0c;返回含有该关键词的所有信息结果。 在我们平时用到最多的便是数据库搜索&#xff1a; SELECT * FROM USE WHERE NAME LIKE %小菜%但是用数据库做搜索存…

Scala函数至简原则

一、Scala中的函数基础知识 1、基本语法 【函数和方法的区别】 【核心概念】 &#xff08;1&#xff09;为完成某一功能的程序语句的集合&#xff0c;称为函数。 &#xff08;2&#xff09;类中的函数称之方法。 【案例实操】 &#xff08;1&#xff09;Scala 语言可以在任何…

THP Maleimide,1314929-99-1,THP-Mal凯新生物双功能螯合剂

一、产品描述&#xff1a; THP-Mal 双功能螯合剂。肽和抗体标记。对SH基团的特异性反应&#xff0c;如半胱氨酸。炔烃马来酰亚胺是一种双功能接头试剂&#xff0c;可将末端炔烃连接到各种含硫醇分子&#xff0c;例如含有半胱氨酸残基的蛋白质&#xff0c;然后可以通过铜催化的…

2022腾讯全球数字生态大会【存储专场】它来了|预约有礼

它来了&#xff01;它来了&#xff01; 2022腾讯全球数字生态大会【存储专场】它来了&#xff01; 作为腾讯集团产业互联网规格最高、规模最大、覆盖面最广的年度盛会 今年存储专场与您一起探讨 分布式高性能存储与数据分析处理的科技创新和最新成果 存储会场六大亮点&…

java 基于 SpringMVC+Mybaties+ Html5 + Vue 前后端分离 房地产管理系统 的 设计与实现

一.项目介绍 本系统分为 两大块 前端 和 后端 &#xff08;前后端分离&#xff09; 角色分为三类&#xff1a; 管理员 销售 以及 普通用户 前端模块有&#xff1a;首页、房屋中心、关于大厦、新闻资讯、个人中心、后台管理、客服售后 其中个人中心&#xff1a;个人中心、我的收…

1.线性代数基础

1.矩阵 2. 特殊矩阵 正交矩阵 AATE&#xff08;E为单位矩阵&#xff0c;AT表示“矩阵A的转置矩阵”。&#xff09;或ATAE&#xff0c;则n阶实矩阵A称为正交矩阵 正交矩阵有如下性质&#xff1a; A是正交矩阵&#xff0c;AT也是正交矩阵A的各行是单位向量且两两正交&#xff0…

Google Earth Engine(GEE)——NASA NEX GDPDDP CMIP5数据集中的问题

问题&#xff1a; 我正在使用 NASA NEX GDPDDP CMIP5 集合。我注意到模型“GFDL-CM3”似乎缺少场景 RCP4.5 的 2096-2099 年。 您可以通过此脚本查看丢失的图像&#xff0c;并与模型 ACCESS1-0 进行比较&#xff1a; https://code.earthengine.google.com/7b505c81a59f10ba5…

[附源码]Python计算机毕业设计Django的高校车辆租赁管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

学习笔记11月27日

Infant Brain Deformable Registration Using Global and Local Label-Driven Deep Regression Learning 文章来源&#xff1a;谷歌学术 一、摘要 婴儿大脑磁共振&#xff08;MR&#xff09;图像的可变形配准具有挑战性&#xff0c;因为&#xff1a;(1)这些纵向图像存在较大的…

【MySQL】读写分离主从复制

1. 原理篇 1.1 读写分离问题场景&#xff1a; 高并发场景&#xff0c;读数据操作远高于写数据操作 —— 为了实现读写分离&#xff0c;我们使用数据库的主从复制&#xff1a; 1.2 主从复制&#xff1a; 实现主从复制的流程如下&#xff1a; MySQL 的主从复制实现机制如下&am…

shell基本命令

shell基本命令 echo&#xff1a; -n&#xff1a;取消输出后行末的换行符号 -e&#xff1a;支持反斜线控制的字符转换 echo -e "\a":输出警告声 echo -e "\e[1;31m abcd \e[0m"&#xff1a;输出带颜色的信息bash执行方法&#xff1a; 给bash文件添加执行…

《龙湖地产》企业门户网站前端设计(Html,CSS,JavaScript,jQuery)

目 录 引言 1 一、企业网站建设方案 2 &#xff08;一&#xff09;搭建网站的必要性和可行性 2 &#xff08;二&#xff09;网站建设的目的 2 &#xff08;三&#xff09;网站设计原则 2 二、企业网站开发工具的选择和介绍 4 &#xff08;一&#xff09; HTML概述 4 &#xff0…

上市公司共同机构所有权数据-附顶刊《管理世界》数据应用示例

1、数据来源&#xff1a;见数据说明文件 2、时间跨度&#xff1a;2003-2020 3、区域范围&#xff1a;所有上海、深圳证券交易所A股主板、中小企业板、科创板、创业板上市公司 4、指标说明&#xff1a; 具体计算方式详见分享文件夹文本文档 描述性统计如下&#xff1a; 部分…

Docker容器学习笔记(看了狂神视频)

狂神的笔记更加系统详细&#xff0c;推荐大家可以去看狂神的视频教程和笔记。我这里仅根据我自己的需求写的笔记&#xff0c;对于需要快速掌握docker的使用的朋友可以参考学习。 Docker 背景需求 之前&#xff0c;开发一套环境&#xff0c;上线一套环境&#xff0c;环境配置十…

STM32滴答定时器SysTick精准延时,兼容HAL库和标准库

STM32手册资料下载&#xff1a;STM32资料Github链接&#xff1b;STM32资料Gitee链接&#xff1b; 注意&#xff1a;Github是国外的&#xff0c;要翻墙&#xff0c;Gitee是国内的&#xff0c;无需翻墙。 目录 滴答定时器的功能 模块化思想 什么叫做模块化 如何利用keil实现…

用 Wireshark 让你看见 TCP 到底是什么样!

本文为掘金社区首发签约文章&#xff0c;14天内禁止转载&#xff0c;14天后未获授权禁止转载&#xff0c;侵权必究&#xff01; 莫听穿林打叶声&#xff0c;何妨吟啸且徐行。 前言 当你看到这篇文章时&#xff0c;你只能看到已经渲染好的文字和图像&#xff0c;而网络数据的交…

rk3588硬件构成-rock5b

前言 rk3588是瑞芯微的一套新的arm64的板子&#xff0c;上一代用的比较多的是rk3399&#xff0c;新的硬件设备比之前更强大&#xff0c;接口更多&#xff0c;本系列就是介绍相关的硬件软件的一些资料&#xff0c;后面会根据不同的使用进行分篇的介绍 很多资料官网有提供&…