微信支付 API v3

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

1. 获取商户API证书

登录商户平台【API安全】->【API证书】->【查看证书】,可查看商户API证书序列号。

商户API证书和微信支付平台证书均可以使用第三方的证书解析工具,查看证书内容。或者使用openssl命令行工具查看证书序列号。

/*
* 加载私钥
* Read private key from file
*
* @param string    $filepath     PEM encoded private key file path
* 
* @return resource|bool     Private key resource identifier on success, or FALSE on error
*/
public static function getPrivateKey($filepath) {
    return openssl_get_privatekey(file_get_contents($filepath));
}


2. 调用支付API生成签名生成

商户可以按照下述步骤生成请求的签名。

1. 构造签名串

我们希望商户的技术开发人员按照当前文档约定的规则构造签名串。微信支付会使用同样的方式构造签名串。如果商户构造签名串的方式错误,将导致签名验证不通过。下面先说明签名串的具体格式。

签名串一共有五行,每一行为一个参数。行尾以 \n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n

HTTP请求方法\n        
URL\n
请求时间戳\n
请求随机串\n
请求报文主体\n

第一步,获取HTTP请求的方法(GET,POST,PUT)等

GET

第二步,获取请求的绝对URL,并去除域名部分得到参与签名的URL。如果请求中有查询参数,URL末尾应附加有'?'和对应的查询字符串。

/v3/certificates

第三步,获取发起请求时的系统当前时间戳,即格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,作为请求时间戳。微信支付会拒绝处理很久之前发起的请求,请商户保持自身系统的时间准确。

$ date +%s
1554208460

第四步,生成一个请求随机串,可参见生成随机数算法。这里,我们使用命令行直接生成一个。

$ hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random
593BEC0C930BF1AFEB40B4A08C8FB242

第五步,获取请求中的请求报文主体(request body)。文章来源地址https://www.toymoban.com/news/detail-676056.html

  • 请求方法为GET时,报文主体为空。
  • 当请求方法为POST或PUT时,请使用真实发送的JSON报文。
  • 图片上传API,请使用meta对应的JSON报文。
  • 接口参数 json格式
  • $url3 = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds";
    // 微信 V3 退款
    $mch_private_key = openssl_get_privatekey(file_get_contents($api_key));//私钥
    $serial_no = '**************************'; // 序列号
    
    // 生成token 验签
    $http_method = 'POST';
    $timestamp = time();//时间戳
    $nonce = $str_32;//随机串
    $body = json_encode($data_record2); // 接口参数
    
    $url_parts = parse_url($url3); # 接口地址
    $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ?"?${url_parts['query']}" : ""));
    $message = $http_method."\n".
    $canonical_url."\n".
    $timestamp."\n".
    $nonce."\n".
    $body."\n";

3.计算签名值

openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
$sign = base64_encode($raw_sign);

$schema = 'WECHATPAY2-SHA256-RSA2048';
$token =sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
                    $mch_id, $nonce, $timestamp, $serial_no, $sign);
$headerArray = [
    'Accept: application/json',
    'User-Agent: */*',
    'Content-Type: application/json; charset=utf-8',
    "Authorization: {$schema} {$token}",
    "Wechatpay-Serial:{$serial_no}"
];


$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url3);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data_record2));
curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output3 = curl_exec($curl);
$output3 = json_decode($output3,true);

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

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

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

相关文章

  • java微信支付v3系列——6.微信支付查询订单API

    java微信支付v3系列——1.微信支付准备工作 java微信支付v3系列——2.微信支付基本配置 java微信支付v3系列——3.订单创建准备操作 java微信支付v3系列——4.创建订单的封装及使用 java微信支付v3系列——5.微信支付成功回调 java微信支付v3系列——6.微信支付查询订单API java微信支

    2023年04月08日
    浏览(41)
  • C# 获取电脑序列号和主板序列号

    项目中有需求要从软件中获取当前电脑的整机序列号和主板序列号,研究一番,C#的实现如下: 对于主流的计算机产品来说,这两个方法都没有问题。 但是对于一些行业定制的产品,比如某些加固平板,加固笔记本等设备,主板序列号可能是缺失的,要具体问题具体分析了。

    2024年02月16日
    浏览(58)
  • QT软件开发: 获取CPU序列号、硬盘序列号、主板序列号 (采用wmic命令)

    QT版本:   5.12.6 环境: win10 64位 编译器: MinGW 32 通过wmic 命令获取CPU序列号、硬盘序列号、主板序列号、CPU名称等信息。 做软件加密、数据加密、软件1机1码绑定的场合比较实用。 WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了从命令行接口和批命令脚本执行

    2024年02月07日
    浏览(77)
  • Android设备序列号:如何获取和查找您的Android设备的序列号

    Android设备序列号:如何获取和查找您的Android设备的序列号 在使用Android设备时,有时候需要查找设备的序列号来进行诊断、维修或者进行其他操作。本文将介绍如何获取和查找Android设备的序列号,并提供相应的源代码示例。 Android设备的序列号是一个唯一的标识符,用于区分

    2024年02月07日
    浏览(58)
  • java获取linux和window序列号

    获取系统序列号在Java中并不是一个直接支持的功能,因为Java语言本身并不提供直接访问硬件级别的信息,如CPU序列号。但是,我们可以使用一些平台特定的工具或命令来实现这一功能。下面我将展示如何使用Java获取Windows和Linux系统上的CPU序列号、磁盘、mac地址等信息,及使

    2024年01月24日
    浏览(65)
  • Android 12.0默认授予app获取序列号SerialNo权限

    在12.0的系统rom定制化中,在一些第三方app开发中,会获取序列号等属性,而在10.0以后的高版本对于获取系统属性的相关信息要求严格 必须有权限才可以,10.0以前的Android版本中,可以直接通过调用Build.SERIAL来获取序列号,在高版本中,为了保护个人隐私, 不让第三方应用轻

    2024年02月07日
    浏览(97)
  • QT6 C++获取Window系统计算机的主机BIOS序列号源代码

    这是自己用QT6 C++编程语言开发的获取主机BIOS序列号的程序。经过调试,可以在Window10系统和Win7系统运行。

    2024年02月09日
    浏览(52)
  • java对接微信支付api3心得(小白易懂)

            公司做的项目中,需要支付功能,因为做的微信小程序项目,所以直接就用微信支付了,以前我也对接过微信支付,但以前没有java的sdk,并且还是用的xml报文,我们还得解析xml才行,所以麻烦的很,这次对接突然发现,微信已经提供了好多中语言的sdk,其中也包

    2024年02月03日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包