php hex2bin nodejs,这可能是用来开发微信支付APIv3的NodeJS SDK中最好的一个

原文作者是微信官方推荐的php SDK(https://github.com/wechatpay-apiv3)作者。不得不说这货很闲,在成熟的思维基础上又推出了nodejs版。而且很荣幸,他是我同事。

如下是他对nodejs版本的介绍:

微信支付官方提供了两个包,一个是Java版的,另一个是PHP版的。继上一篇无侵入地向官方PHP版提供了媒体文件上传功能之后,我就在想,NodeJS都已经到14.4版本了,应该有一个流行的js版的开发包吧。搜了一圈儿,发现几乎没有,遂动手花了大约两周闲暇时间,完整实现了微信支付APIv3的几乎所有功能,特别地对账单下载及处理,也算是填补并加强了官方包暂未实现的功能之一吧。有了这些成熟开发包的覆盖,包括官方包在内,现在是时候全面切换至微信支付APIv3版了。

项目以MIT许可证开源,使用请保留许可证说明。

83de2b04c333f9acc62939c1cffd583b.png

Axios拦截器项目构造函数

主要功能

1. 使用Node原生代码实现微信支付APIv3的AES加/解密功能(aes-256-gcm with aad)

2. 使用Node原生代码实现微信支付APIv3的RSA加/解密、签名、验签功能(sha256WithRSAEncryption with RSA_PKCS1_OAEP_PADDING)

3. 大部分微信支付APIv3的HTTP GET/POST应该能够正常工作,依赖 Axios

4. 支持微信支付APIv3的媒体文件上传(图片/视频)功能,可选依赖 form-data

5. 支持微信支付APIv3的应答证书下载功能,依赖 commander, 使用手册如下

6. 支持微信支付APIv3的帐单下载及解析功能

安装

$ npm install wechatpay-axios-plugin

系统要求

NodeJS的原生crypto模块,自v12.9.0在 publicEncrypt 及 privateDecrypt 增加了 oaepHash 入参选项,本项目显式声明入参,本人不确定其在v12.9.0以下是否正常工作。所以Node的最低版本要求应该是v12.9.0.

万里长征第一步

微信支付APIv3使用了许多成熟且牛逼的接口设计(RESTful API with JSON over HTTP),数据交换使用非对称(RSA)加/解密方案,对上行数据要求(RSA)签名,对下行数据要求(RSA)验签。API上行所需的商户RSA私钥证书,可以由商户的超级管理员在微信支付商户平台生成并获取到,然而,API下行所需的平台RSA公共证书只能从 /v3/certificates 接口获取(应答证书还经过了AES对称加密,得用 APIv3密钥才能解密)。本项目也提供了命令行下载工具,使用手册如下:

$ ./bin/certificateDownloader -h

6de6427dbf42aebde521c1a76ef90c07.png

命令行工具帮助文档

注:像其他通用命令行工具一样,-h --help 均会打印出帮助手册,说明档里的 指 必选参数,类型是字符串; [string] 指 可选字符串参数,默认值是 /temp(系统默认临时目录)

$ ./bin/certificateDownloader -m NUMERICAL -s HEXADECIAL -f apiclient_key.pem -k YOURAPIV3SECRETKEY -o .

e5ee35a90545240b7275242278dc06ed.png

命令行工具执行结果

注:提供必选参数且运行后,屏幕即打印出如上信息,提示证书序列号及起、止格林威治(GMT)时间以及证书下载保存位置。

接口通讯要用 商户RSA私钥证书 签名及平台RSA公共证书验签,只有获取到了平台RSA公共证书,后续的其他接口才能正常应答验签,所谓“万里长征第一步”就在这里。本下载工具也无例外对应答内容,做了验签处理,技法“剑(qí)走(zhāo)偏(yín)锋(jì)“而已,即:用Axios的拦截器把下载的证书(AES解密)处理完后,立即用于验签。

得到证书之后,开发者需要把所得serial及wechatpay_HEXADECIALHEXADECIALHEXADECIAL.pem(文件流或者文本内容)组成 对,key为证书序列号,value为证书内容,传入项目构造函数的certs字段里。 其他接口使用就基本上没有啥问题了。

文档及示例在github及npm上README都有,也都是基本用法,没啥花活儿,祝开心。

非常抱歉,是我理解有误了。以下是使用微信支付 V3 版本 API 请求预支付订单数据的示例 PHP 代码: ```php <?php // 商户号 $merchant_id = '商户号'; // 商户API密钥 $merchant_key = '商户API密钥'; // 微信支付APIv3密钥 $wechat_pay_api_v3_key = '微信支付APIv3密钥'; // 应用ID $app_id = '应用ID'; // 商户订单号 $out_trade_no = '商户订单号'; // 订单总金额,单位为分 $total_amount = 1; // 商品描述 $body = '测试商品'; // 用户标识 $openid = '用户标识'; // 支付结果通知地址 $notify_url = '支付结果通知地址'; // 生成随机字符串 $nonce_str = bin2hex(random_bytes(16)); // 获取当前时间戳 $timestamp = time(); // 组装请求头 $headers = [ 'Accept: application/json', 'Content-Type: application/json', 'Wechatpay-Serial: 商户API证书序列号', 'Authorization: ' . get_authorization_header($merchant_key, $appid, $merchant_id, $nonce_str, $timestamp), ]; // 组装请求体 $body = [ 'appid' => $app_id, 'mchid' => $merchant_id, 'description' => $body, 'out_trade_no' => $out_trade_no, 'amount' => [ 'total' => $total_amount, 'currency' => 'CNY', ], 'payer' => [ 'openid' => $openid, ], 'notify_url' => $notify_url, 'nonce_str' => $nonce_str, 'sign_type' => 'HMAC-SHA256', 'timestamp' => $timestamp, ]; $payload = json_encode($body); // 发送请求 $ch = curl_init('https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); $response = curl_exec($ch); curl_close($ch); // 处理响应结果 $result = json_decode($response, true); $prepay_id = $result['prepay_id']; // 返回预支付订单ID echo $prepay_id; // 获取Authorization头部 function get_authorization_header($merchant_key, $appid, $merchant_id, $nonce_str, $timestamp) { $message = $timestamp . "\n" . $nonce_str . "\n" . file_get_contents('php://input') . "\n"; $signature = base64_encode(hash_hmac('sha256', $message, $merchant_key, true)); return sprintf('WECHATPAY2-SHA256-RSA2048 mchid="%s",nonce_str="%s",timestamp="%s",serial_no="%s",signature="%s"', $merchant_id, $nonce_str, $timestamp, '商户API证书序列号', $signature ); } ``` 请根据自己的实际情况修改示例代码的参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值