支付宝 v3 自签名如何实现

这篇具有很好参考价值的文章主要介绍了支付宝 v3 自签名如何实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天在看文档的时候,发现支付宝新出了一个 v3 版本的接口调用方式,感觉有点意思,花了点时间研究了下这个版本要怎么实现自签名,大家有兴趣可以看看。

 

什么是支付宝 API v3 版本?

官网上给的解释是基于 OAS3.0 API 规范,支付宝做了相应的 API 升级(v3),在开发体验上进行了重点优化。

与之前支付宝 API 的主要区别有几条:

  • 使用 RESTful 设计风格,并通过 OpenAPI 规范(OAS)描述接口。
  • 使用 JSON 作为数据交互的格式,不再使用 XML 和表单格式。
  • 简化加验签逻辑,对 HTTP 报文整体进行签名。
  • 简化加解密、文件上传等规范。

更多内容及详细介绍可直接参考 v3 协议简介

其实之前也没有 v2 的概念,不过根据对文档整体的理解来看,v2 版本的概念应该就是之前调用的 通用版本 Easy 版本 。

两个版本的差异可以参考下方表格:

 

 

顺便提一句,通用版目前是我用的最多的方式,主要是用习惯了不想改(可不是因为偷懒_(:з」∠)_不过新版方式后面也可以试一下看看。

PS:通用版自签名的方法可以参考:[SDK 如何实现签名],SDK 接口调用方式参考:[代码示例]。

 

如何对接v3版本

v3 版本比起 v2 版本来说 改变的地方还是挺多的,最大的改变就是请求的方式,由原本的 RPC 风格切换成了RESTful

下面我们就来看看 v3 版本自签名是如何调用的

下面以 统一收单交易支付接口 为例。

 

步骤一:构造 authString

authString 也就是 v3 版本新加的身份鉴权信息。

需要用到的参数有:

  • app_id:开放平台颁发的应用 id。
  • timestamp:Unix 时间戳,精确到毫秒。
  • nonce:自定义参数,自己生成唯一性字符串,每次请求要保证唯一。

组装示例

long Unix=date.getTime();
String authString= "app_id="+app_id+",timestamp="+Unix+",nonce=3246658768654544";

authString生成内容

app_id=2014111111111122,timestamp=1702452177941,nonce=3246658768654544

 

 

步骤二:拼接待签名字符串

需要用到的参数有:

  • authString:上一步返回。
  • httpMethod:本次请求的 http 方法,例如 GET\POST\PUT。
  • httpReuqestUrl:这个从对应接口文档请求 url 中拿,不包含域名值。
  • httpRequestBody:本次请求的 body 内容;GET方式请求时,入参空字符串。

注意:下方代码示例中的 \n 千万不能丢!!!不然验签通过不了的QAQ

组装示例

String httpMethod="POST";
String httpReuqestUrl=    "/v3/alipay/trade/precreate";
String httpRequestBody="{\"out_trade_no\":\"20181128763521373251698\",\"total_amount\":\"1\",\"subject\":\"123\",\"body\":\"body\"}";
String content=authString+"\n"+httpMethod+"\n"+httpReuqestUrl+"\n"+httpRequestBody+"\n";
System.out.println("content:"+"\n"+content);

返回内容

app_id=2021111111111122,timestamp=1702452177941,nonce=3246658768654544
POST
/v3/alipay/trade/precreate
{"out_trade_no":"20181128763521373251698","total_amount":"1","subject":"123","body":"body"}

 

步骤三:生成 sign

需要用到的参数有:

  • content:上一步返回。
  • privateKey:应用私钥,如何获取参考[如何获取商户私钥]。
  • charset:编码格式。

加签方式这边我想吐槽下:文档上加密方式说是支持 SHA256withRSA 和 SM3WithSM2 两种,但是能用国密加签方式为什么不给我国密配置入口哇,不给入口说支持都是耍流氓啊 😓……

签名代码

 private static String doSign(String content,String privateKey,String charset) throws ApiException {
        try {
            byte[] encodedKey = privateKey.getBytes();
            encodedKey = Base64.getDecoder().decode(encodedKey);

            PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(encodedKey));

            Signature signature = Signature.getInstance("SHA256WithRSA");
            signature.initSign(priKey);
            signature.update(content.getBytes(charset));
            byte[] signed = signature.sign();
            return new String(Base64.getEncoder().encode(signed));
        } catch (Exception e) {
            String errorMessage = "签名遭遇异常,请检查私钥格式是否正确。content=" + content + " privateKeySize=" + privateKey + " reason=" + e.getMessage();
            throw new ApiException(errorMessage);
        }
    }

返回 sign 值

sign:WDF6pS2qK/kEZnsJDMrhNmd/z82ClZ+VMohYxIUs3MZ2j0m+4reQtSBGa6mZyA5ffbIPPvZTRO+1DLEuuCvZRMQGK3okYSA/ASP7GEqfCDeKmkqzKV2kWrmftNfO+EiIiCnsiyJG4SQ9G7s0OtmCT6wVkphW9wgk7mfUoF5a+Wo3kzvEur3U+7ZfSgLa4HXQG2xE+z7BjmHG8j1qVoVa/3TR1lVBAqOwkodZ9cSPKceK2RxaPkk8gsFbofbuARl5xBqDwkS2caTQu27+DLXT/QJOHRHRw5VtH9v8B7nT+nrijFjktm6hD7aIHuPon6TtEgnbtWltRizEZldh+Fo1Eg==

 

步骤四:发起请求

需要注意的参数:

  • url:文档中的「请求 url」。
  • Content-Type:数据类型。
  • alipay-request-id:自定义参数,保证唯一就可以。
  • authorization:${签名算法} ${authString},sign=${signature}。

注意:上方代码 authorization 中的空格不要丢!!

例如

ALIPAY-SHA256withRSA app_id=2014111111111122,timestamp=1702452177941,nonce=3246658768654544,sign=WDF6pS2qK/kEZnsJDMrhNmd/z82ClZ+VMohYxIUs3MZ2j0m+4reQtSBGa6mZyA5ffbIPPvZTRO+1DLEuuCvZRMQGK3okYSA/ASP7GEqfCDeKmkqzKV2kWrmftNfO+EiIiCnsiyJG4SQ9G7s0OtmCT6wVkphW9wgk7mfUoF5a+Wo3kzvEur3U+7ZfSgLa4HXQG2xE+z7BjmHG8j1qVoVa/3TR1lVBAqOwkodZ9cSPKceK2RxaPkk8gsFbofbuARl5xBqDwkS2caTQu27+DLXT/QJOHRHRw5VtH9v8B7nT+nrijFjktm6hD7aIHuPon6TtEgnbtWltRizEZldh+Fo1Eg==

 

参考文档配置 head 和 body;

请求代码

package HttpClientTest;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

/*
 * 使用Apache的HttpClient发送GET和POST请求的步骤如下:
 *   1. 使用帮助类HttpClients创建CloseableHttpClient对象.
 *   2. 基于要发送的HTTP请求类型创建HttpGet或者HttpPost实例.
 *   3. 使用addHeader方法添加请求头部,诸如User-Agent, Accept-Encoding等参数.
 *   4. 对于POST请求,创建NameValuePair列表,并添加所有的表单参数.然后把它填充进HttpPost实体.
 *   5. 通过执行此HttpGet或者HttpPost请求获取CloseableHttpResponse实例
 *   6. 从此CloseableHttpResponse实例中获取状态码,错误信息,以及响应页面等等.
 *   7. 最后关闭HttpClient资源.
 * */

public class V3HttpPostTest {

    public static void main(String args[]) throws Exception {
        // 发送请求的url
        String url = "https://openapi.alipay.com/v3/alipay/trade/precreate";

        // 发送请求的内容
        String content = "{\"out_trade_no\":\"20181128763521373251698\",\"total_amount\":\"1\",\"subject\":\"123\",\"body\":\"body\"}";
        String chearset = "utf-8";
        // 创建请求对象:post或者get
        HttpPost httpPost = new HttpPost(url);
        // httpClient实例化
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 设置类型
        // "application/x-www-form-urlencoded","application/json"、multipart/form-data、text/xml
        httpPost.setHeader("Content-Type", "application/json");
        // 调用方的requestId,用于定位一次请求,需要每次请求保持唯一。
        httpPost.setHeader("alipay-request-id", "32432432432423421");
        httpPost.setHeader("authorization",
                "ALIPAY-SHA256withRSA app_id=2021111111111122,timestamp=1702452177941,nonce=3246658768654544,sign=WDF6pS2qK/kEZnsJDMrhNmd/z82ClZ+VMohYxIUs3MZ2j0m+4reQtSBGa6mZyA5ffbIPPvZTRO+1DLEuuCvZRMQGK3okYSA/ASP7GEqfCDeKmkqzKV2kWrmftNfO+EiIiCnsiyJG4SQ9G7s0OtmCT6wVkphW9wgk7mfUoF5a+Wo3kzvEur3U+7ZfSgLa4HXQG2xE+z7BjmHG8j1qVoVa/3TR1lVBAqOwkodZ9cSPKceK2RxaPkk8gsFbofbuARl5xBqDwkS2caTQu27+DLXT/QJOHRHRw5VtH9v8B7nT+nrijFjktm6hD7aIHuPon6TtEgnbtWltRizEZldh+Fo1Eg==");
        // 支付宝根证书序列号,使用证书模式时,需要传递该值
        // httpPost.setHeader("alipay-root-cert-sn", "");

        // 组织数据
        StringEntity se = null;
        try {
            se = new StringEntity(content);
            // 设置编码格式
            se.setContentEncoding(chearset);
            // 设置数据类型
            se.setContentType("application/json");
            // post请求,将请求体填充进httpPost
            httpPost.setEntity(se);
            // 通过执行httpPost获取实例
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            String resData = EntityUtils.toString(entity);
            System.out.println("返回消息:" + resData);
            // 关闭httpClient资源
            httpClient.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

返回信息

{
    "out_trade_no":"20181128763521373251698",
    "qr_code":"https://qr.alipay.com/bax05640qkuz8quo6tgn2565"
}

 

 

 

以上就是 支付宝 v3 自签名如何实现 的所有内容了,希望对你有所帮助 ✿✿ヽ(°▽°)ノ✿文章来源地址https://www.toymoban.com/news/detail-760333.html

到了这里,关于支付宝 v3 自签名如何实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java实现微信小程序V3支付

    2024年02月12日
    浏览(44)
  • PHP实现小程序微信支付(v3版本)

    PS:本篇文章是PHP对小程序进行微信支付v3版本的实现,仅用于对支付流程的了解,具体使用方面需要大家自行调整 小程序端JS代码: PHP类的相关代码:

    2024年02月12日
    浏览(44)
  • Java实现微信小程序V3支付 (完整demo)

    2024年02月07日
    浏览(27)
  • springboot实现微信小程序V3微信支付功能

    appId:小程序appid appSecret:小程序的secret mchId:商户号 keyPath:商户私钥路径(apiclient_key.pem) certPath:证书路径(apiclient_cert.pem) platFormPath:平台证书(cert.pem) 注 : 需要通过写程序生成平台证书(见v3Get()方法) apiKey3:apiv3密钥 serialnumber:商户证书序列号 notifyUrl:回调地

    2024年02月12日
    浏览(39)
  • PHP实现对微信支付v3版本回调数据的解密

    PS:本文使用了微信官方给出的demo来实现对回调数据的解密,本文主要对微信官方给出的demo如何使用作出部分个人讲解,以及对解密前后数据的格式进行展示 PHP类:这是微信官方给出的demo

    2024年02月15日
    浏览(34)
  • springboot整合IJPay实现微信支付-V3---微信小程序

    微信支付适用于许多场合,如小程序、网页支付、但微信支付相对于其他支付方式略显麻烦,我们使用IJpay框架进行整合 JPay 让支付触手可及, 封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。不依赖任何第三方 mvc 框架,仅仅作为工具使用简单

    2024年02月02日
    浏览(55)
  • 安卓 APK 签名证书过期问题 及 更新签名方案 v3

    最近突然发现公司祖传的签名证书要过期了,急忙开始研究解决方案,在这里记录下我们采取的方式。 首先, 签名证书过期是没办法进行续期或者重新生成的 。而更换证书,那原来安装的 App 就必须要卸载后才能安装版本,而如果 App 已经上架应用市场,那么证书不一致的

    2024年02月03日
    浏览(31)
  • 【微信支付】java-微信小程序支付-V3接口

    最开始需要在微信支付的官网注册一个商户; 在管理页面中申请关联小程序,通过小程序的 appid 进行关联;商户号和appid之间是多对多的关系 进入微信公众平台,功能-微信支付中确认关联 具体流程请浏览官方文档:接入前准备-小程序支付 | 微信支付商户平台文档中心 流程走

    2024年02月06日
    浏览(43)
  • SpringBoot整合微信小程序支付V3(支付、退款)

    微信支付开发前,需要先获取商家信息,包括商户号、AppId、证书和密钥。 获取商户号 微信商户平台 申请成为商户 = 提交资料 = 签署协议 = 获取商户号 获取AppID 微信公众平台 注册服务号 = 服务号认证 = 获取APPID = 绑定商户号 申请商户证书 登录商户平台 = 选择 账户中心 = 安

    2024年02月08日
    浏览(28)
  • 微信支付 API v3

    1. 获取商户API证书 登录商户平台【API安全】-【API证书】-【查看证书】,可查看商户API证书序列号。 商户API证书和微信支付平台证书均可以使用第三方的证书解析工具,查看证书内容。或者使用openssl命令行工具查看证书序列号。 2. 调用支付API生成签名生成 商户可以按照下述

    2024年02月11日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包