IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP在微信支付API V3请求接口签名的生成 -> 正文阅读

[PHP知识库]PHP在微信支付API V3请求接口签名的生成

? 微信支付的支付接口更新了到了apiv3 ,主要难题还是在签名生成,只要这个解决,其他都不是问题,看了下签名生成的步骤,下面贴出详细的代码,封装调用方法:

<?php
/**
?*?微信公共配置方法
?*/

/*备注:apiclient_cert.p12是商户证书文件,除PHP外的开发均使用此证书文件*/


#微信基础信息
$wxMerchantId?=?"商户号";???????????????????????????????????????????????//商户号
$wxMerchantApiCertificate?=?__DIR__?.?"/cert/apiclient_cert.pem";???????//商户证书
$wxMerchantApiPrivateKey?=?__DIR__?.?"/cert/apiclient_key.pem";?????????//商户私钥
$wxApiV3Key?=?"微信API?v3密钥";?????????????????????????????????????????//微信API?v3密钥
$wxApiSerialNo?=?"商户API证书序列号";???????????????????????????????????//商户API证书序列号

#############微信构造签名流程#############

/**
?*?生成签名
?*?@param?string?$method?请求方法?POST?或者GET
?*?@param?string?$url?请求URL
?*?@param?string?$request?请求中的请求报文主体
?*?@param?$wxMerchantId商户号
?*?@param?$certKey商户私钥
?*?@param?$wxApiSerialNo商户API证书序列号
?*?@return?string
?*/
function?RequestSign($method?=?"POST",?$url?=?"",?$request?=?"",?$wxMerchantId,?$certKey,?$wxApiSerialNo)
{
????#截取获取当前请求地址【去除域名】
????$url_parts?=?parse_url($url);
????$path?=?($url_parts['path']?.?(!empty($url_parts['query'])???"?${url_parts['query']}"?:?""));
????#获取当前时间戳
????$timeStamp?=?time();
????#生成一个随机字符串
????$nonceStr?=?getNonceStr();
????#构造签名串
????$requestSign?=?sprintf("%s\n%s\n%s\n%s\n%s\n",?$method,?$path,?$timeStamp,?$nonceStr,?$request);
????#计算计算签名值
????$sign?=?calculateSignatureValue($requestSign,?$certKey);
????#设置HTTP头获取Authorization
????$token?=?createToken($wxMerchantId,?$nonceStr,?$timeStamp,?$wxApiSerialNo,?$sign);
????#返回
????return?$token;
}

/**
?*?计算签名值
?*?@param?$requestSign
?*?@param?$certKey
?*?@return?string
?*?使用商户私钥对待签名串进行SHA256?with?RSA签名,并对签名结果进行Base64编码得到签名值
?*/
function?calculateSignatureValue($requestSign,?$certKey)
{
????$certKey?=?file_get_contents($certKey);
????openssl_sign($requestSign,?$raw_sign,?$certKey,?'sha256WithRSAEncryption');
????$sign?=?base64_encode($raw_sign);
????return?$sign;
}

/**
?*?获取token
?*?@param?$merchant_id
?*?@param?$nonce
?*?@param?$timestamp
?*?@param?$serial_no
?*?@param?$sign
?*?@return?string
?*/
function?createToken($merchant_id,?$nonce,?$timestamp,?$serial_no,?$sign)
{
????$schema?=?'WECHATPAY2-SHA256-RSA2048';
????$token?=?sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
????????$merchant_id,?$nonce,?$timestamp,?$serial_no,?$sign);
????return?$token;
}

/**
?*?产生随机字符串,不长于32位
?*?@param?int?$length
?*?@return?string
?*/
function?getNonceStr($length?=?32)
{
????$chars?=?"abcdefghijklmnopqrstuvwxyz0123456789";
????$str?=?"";
????for?($i?=?0;?$i?<?$length;?$i++)?{
????????$str?.=?substr($chars,?mt_rand(0,?strlen($chars)?-?1),?1);
????}
????return?$str;
}


/**
?*?post请求
?*?@param?$url
?*?@param?$authorization
?*?@return?mixed
?*/
function?curlPostWithWx($url,?$authorization)
{
????$paramsString?=?json_encode($params);
????//?初始化curl
????$ch?=?curl_init();
????//?设置超时
????curl_setopt($ch,?CURLOPT_TIMEOUT,?$timeout);
????curl_setopt($ch,?CURLOPT_URL,?$url);
????curl_setopt($ch,?CURLOPT_SSL_VERIFYPEER,?FALSE);
????curl_setopt($ch,?CURLOPT_SSL_VERIFYHOST,?FALSE);
????curl_setopt($ch,?CURLOPT_HEADER,?FALSE);
????curl_setopt($ch,?CURLOPT_RETURNTRANSFER,?TRUE);
????//?post数据
????curl_setopt($ch,?CURLOPT_POST,?1);
????//?post的变量
????curl_setopt($ch,?CURLOPT_POSTFIELDS,?$paramsString);
????curl_setopt($ch,?CURLOPT_HTTPHEADER,?array(
????????????'Content-Type:?application/json;?charset=utf-8',
????????????'Content-Length:?'?.?strlen($paramsString),
????????????'Authorization:?'?.?"WECHATPAY2-SHA256-RSA2048?"?.?$authorization,
????????????'Accept:?application/json',
????????????'User-Agent:Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/81.0.4044.138?Safari/537.36'
????????)
????);
????//?运行curl,结果以jason形式返回
????$res?=?curl_exec($ch);
????curl_close($ch);
????//?取出数据
????$data?=?json_decode($res,?true);
????return?$data;
}

/**
?*?get请求
?*?@param?$url
?*?@param?$authorization
?*?@return?mixed
?*/
function?curlGetWithWx($url,?$authorization)
{
????//?初始化curl
????$ch?=?curl_init();
????//?设置超时
????curl_setopt($ch,?CURLOPT_TIMEOUT,?60);
????curl_setopt($ch,?CURLOPT_URL,?$url);
????curl_setopt($ch,?CURLOPT_SSL_VERIFYPEER,?FALSE);
????curl_setopt($ch,?CURLOPT_SSL_VERIFYHOST,?FALSE);
????curl_setopt($ch,?CURLOPT_HEADER,?FALSE);
????curl_setopt($ch,?CURLOPT_RETURNTRANSFER,?TRUE);
????curl_setopt($ch,?CURLOPT_HTTPHEADER,?array(
????????????'Content-Type:?application/json;?charset=utf-8',
????????????'Content-Length:?'?.?strlen($paramsString),
????????????'Authorization:?'?.?"WECHATPAY2-SHA256-RSA2048?"?.?$authorization,
????????????'Accept:?application/json',
????????????'User-Agent:Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/81.0.4044.138?Safari/537.36'
????????)
????);
????//?运行curl,结果以jason形式返回
????$res?=?curl_exec($ch);
????curl_close($ch);
????//?取出数据
????$data?=?json_decode($res,?true);
????//返回
????return?$data;
}
? ? ? ?下面我们调用的demo:

#引入文件
require?__DIR__?.?"/wxComm.php";

#请求接口地址
$url?=?"https://api.mch.weixin.qq.com/v3/certificates";
#组合基本信息
$params?=?array();
$request?=?json_encode($params);
#获取authorization
$authorization?=?RequestSign("GET",?$url,?"",?$wxMerchantId,?$wxMerchantApiPrivateKey,?$wxApiSerialNo);
#请求接口
$data?=?curlGetWithWx($url,?$authorization);
#输出
echo?json_encode($data);

? ? ? ?这里要注意一点,这里的证书是指API证书,要在后台申请,而不是以前的证书。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 11:38:35  更:2021-08-27 11:39:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:35:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码