集成

本指南将提供签署 API 请求的分步说明。

准备钥匙

客户端和 WEN Gateway 必须在进行 API 请求之前交换 RSA 密钥,并且 RSA 密钥的长度必须为 1024/2048/4096 位。 在对 WEN Gateway 进行 API 调用时,客户端需要使用 RSA 私钥对 API 请求进行签名。.

收到 API 请求后,WEN Gateway 将使用客户端的 RSA 公钥来验证签名是否与 API 请求的内容匹配。 同样,当客户端收到 API 响应时,强烈建议客户端使用 WEN Gateway 的 RSA 公钥验证 API 响应的签名。

RSA 密钥对包含私钥和公钥。 生成签名需要私钥,而公钥用于验证签名。

生成 RSA 密钥

著名的 RSA 算法,它通常是先生成一对 RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA 密钥至少为 500 位长,一般推荐使用 2048/4096 位。这就使加密的计算量很大。

有许多可用工具来生成 RSA 密钥。以下步骤是假定您使用 OpenSSL 生成 RSA 密钥对.

1、安装 openssl .

对于 linux 系统(Ubuntu),请使用以下命令生成:

sudo apt-get install openssl

如需在 CentOS 上安装,请参考以下网站 OpenSSL on CentOS.

对于 Windows 系统,下载后从中安装 OpenSSL 官方网站.

2、 生成 RSA 密钥对.

对于 linux 系统(Ubuntu),请使用以下命令:

$ openssl
  OpenSSL> genrsa -out rsa_private_key.pem 2048 ##generate private key
  OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem  -outform PEM - nocrypt   ##transform private key into PKCS8 format
  OpenSSL> rsa -in rsa_private_key.pem -pubout -out  rsa_public_key.pem
         ##Generate public key
  OpenSSL> exit

对于 Windows 系统,请使用以下命令:

C:\Users\UserPC>cd C:\OpenSSL-Win32\bin ##enter OpenSSL directory
  C:\OpenSSL-Win32\bin>openssl.exe ##enter OpenSSL
  OpenSSL> genrsa -out rsa_private_key.pem 2048  ##Generate private key
  OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem  -outform PEM -nocrypt ##Transform private key into PKCS8 format
  OpenSSL> rsa -in rsa_private_key.pem -pubout -out  rsa_public_key.pem ##Generate public key
  OpenSSL> exit

之后,您可以在当前文件夹下看到两个文件, rsaprivatekey.pem and rsapublickey.pem. 前者是私钥,后者是公钥.

3、上传 RSA 公钥
生成 RSA2 密钥对后,必须通过完成以下步骤将公钥与 Wen Gateway 服务器交换以进行签名验证:

将您的公钥绑定到 WEN Gateway

生成私钥和公钥

  1. 下载PuTTYgen,然后将其打开。
  2. 底部有一个参数,然后选择要生成到RSA中的密钥的类型。
  3. 按Gennerate按钮生成公用密钥和专用密钥对。
  4. 保存公钥和私钥
  5. 按下加载按钮,然后选择之前保存的公用和专用密钥。
  6. 转到转化,然后选择 Export OpenSSH key
  7. 用新文件名保存您的公共和私有密钥文件,文件名以.pem结尾,以将其更改为PEM File。

保存在PEM文件中的私钥或公钥应与下述格式相同。

{
    -----BEGIN RSA PRIVATE KEY-----
MIIEoQIBAAKCAQEAmzVCHkKxVlGPty+kut5p02oARfhQ4UveEDkbqbo4Xp1GiovL
ey5L6bYzvPFNQcm30ilpbsqL9o+b/Ndrl49A65RIsOwRtoCwlzZCNfi7ZptAA3+a
ZdA0reH4B4N6O02GNWGGZIn4yEiDDZHjMzuz+2zc1ib1n/DxLkEItd8QLfuZ66sD
5qrZX84rWO1+7Gyl2L8PiIz15bNfIhW6gg17cuTMzWuVJyK8J6VTxNaXc9v6espV
RHqjrPWu/BE6A2S1vkyBTvrYcUF7kLTn0xCell9wJzKuV/XBzs9Wmy+5jn9A+K23
ewiQzRyUAfxCjikZoIbQ60xPw0iAz2pTl5eyTwIBJQKCAQAIY75igCVC76bnTq71
WCFlX6z83P1z9kNa0qeMokg8dzQ+1x/BeB/HcaHuiZV5LX+O0c5ZBAeQyX4NqseL
puDqI7Dm+AD1G7aEttMlgxEMdxg3iltfcwnENbphRWCNlXzgSnX3mMFW7ymttNvZ
QX9ZstuBMonRS0tOm7tIGeUy6ut7VTxmTPmWll4L00Gf09UoR72RoVvt7ZO7VEmI
2bOiiu0jTSeyXkdN7b4EPCMqh+E+YevSEW1tC7N6jJf6iOfKH+BJ/yWV/z1AZ9Gs
zEME5ACS3ZHoQOv6y474NTmDUyYzyLSVbT7RBUgcKhP2CCuSc14pYyGdqnd3kC0u
XwX9AoGBAO/Y06jOkKJNR9LV2dI2TAIUWJYcVzYhs34r6Qliuew0mh0dHMi/MLZG
/UNeuVHyb9gN9DvgAnmw0ObXmR5IJWHenkdPItItATvph+nO2VU+6bazXx/rEcx5
SOYBOCQdE6M8ZoKNVS/7HnqI+yFleEB5GW1Oa9U44u0LFtw5/S3jAoGBAKWpLn2z
ii2wqIyoT26pUbxbN0ZmDJsSVLPslWC7mBP/QIyjO24EId6++dUXxLrumltqwo62
NcGazE/JTyAgWpPEYISm587tTlJ/rFcHdHF8+67W0IMkMue10JuqHu1z6Vr+Righ
Tla3HGNv9q/hGbMSFxWfNoylk/GgaDODvJWlAoGBAIghHi9ge5pjNppCBgGwHU1J
0Wn0aNmIv9H9PxMqMiwd2u3t7b4LpgaW/nJYW1gGI82nDhQlMdZdb6Wc9gpEn5hp
mBqiiWKIPvh9oCrBgkUjtRSq/qNpvf5uWc6mvv+9edkwHoFyz3wY58kBo0pOWQH/
ivjZe3kEnHizRFN6283vAoGAPq63pS8tXWVwNTjEHAi3JKzke4CPJetCpPG7+xaM
kfHhEp6g3YUF5ZReh/sn2AdBUwXNE2eJ9jqSfw3mlojIU5Zptabv7W6MVpEsc/T7
oJAn4Upcu//b6PivzDKIPivbwZCk7Jb7DA3vEN5BqlUsUZgkaQvPc3zr3uK/pMoQ
AUUCgYBYeN7N3pjEMCdIQNu7mwoPOuJdDLhXwURfYzkbPqezIs94wcYFy2cGhWb4
c9fwjLOcPunV8V6cUAkOpb98+k6q+SaR2Y0oT/q4hQzVdoc+tXqW5gm2WOu1KS3P
X+azdiMtcg1SEZPrwzcBIEjbPT7Oiv4josWsgNjiE4SvtTSu1Q==
-----END RSA PRIVATE KEY-----
}

创建预签名字符串

执行以下步骤以对信息进行签名:
1、提取要签名的内容。 例如:

{
      "header"{
        "sign":"",
        "signType" : "",
        "merchantCode": "MERC_0144544"


      };
     "body":{
         "outtradeid":"MERC_0144544_TX_12313213113",
         "coincode":"WCG_WCG",
         "subject":"Bag",
         "subjectdetail":"Red Color Bag.",
         "notifyurl":"http://example.com/notify-url",
         "returnurl":"http://example.com/return-url",
         "totalamount":20.3144,

     }
 }
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDr1FPc+nPVKyVvkQ/ONylATo4XVRsKnk+iNY+GQMY31Ixs06xC
3V5r/kf0WdPpBzPTLWHoqcU1hwY0LElIGPEiZsPti7vK5A0ubB1G7Ha1OvGt11vH
9nygJ05JV9koPVvbgmKZ+s8gny0eWNDr30Q9Up2+R6W/ZNijg1bISXIWhQIDAQAB
AoGAd1LPvBfdVBaosnKrlKPEc41Lx/J/5DeGA4UmQb+0i7s38jiICK0JgYr/zVtG
JbpHNqrXx2lfJ15SfUOLMLeuCclX/PTwVIuzmAtxEZCPTbNNVHyoqH2mVbb69zWq
sDpueh29espbt0l2Sui1zv4C74ubDBjb6ZU4JWDQjffQqwECQQD5mhcfCS1VZoWG
eS+pHO+LjYBpjcT1mK8O+PjCGJ5FZFapZmfy1MSd4xfKvYaOY32KF5PIf8DLLuj3
m2RH5ff9AkEA8d/cYJ0MomnbnEKX1lXlCiglsYRaSPmIPs4iMoyNY0GJE5l/O95u
PxGqaj+uScKwuY7QmqHOipR2ekUBAAOLKQJAMkvAmPpqbikIgv5sgjFYe9B5rctp
guvPar70sXfwfJ8pb105WQ9Sx1X5d1sVgB/ALlFt8Br+KHM9cpeXb32BqQJBALHV
jtl1/skXHcGI8MxFAQ5zsCsRjbQjy3mp41jZIEc+8wL3E6Y4B0TVvz85LPLMc1Uq
3NMkbpBTUbzaKT8SW+kCQQDLJvU+xBVH/ku7EPhkLWy1Oc4QmJ58kAj0KEZtKrtj
5C80YTXbZbZyFdsNFHpVcHFTWAYe8SZLJ/ymeGqrlBeQ
-----END RSA PRIVATE KEY-----

2、 以 key =“value”的格式组合所有数组值,所有请求参数按参数名做字典升序排列,所谓字典升序排列, 就如在字典中排列单词一样排序,按照字母表或数字表里递增顺序的排列次序,即先考虑第一个“字母”,在相同的情况下考虑第二个“字母”,依此类推。第一个字母必须为小写,第二个字母必须为大写,依此类推。例如 :coinCode,returnUrl


coinCode="WCG_WCG"&
notifyUrl="http://example.com/notify-url"&
outTradeId="MERC_0144544_TX_12313213113"&
returnUrl="http://example.com/return-url"&
subject="Bag"&
subjectDetail="Red Color Bag."&
totalAmount=20.3144

3、 首先使用 SHA256withRSA 算法对上一步中获得的签名原文字符串进行签名,然后将生成的签名串使用 Base64 进行编码,即可获得最终的签名串。安全级别,RSA 密钥/对的长度必须是 1024/2048/4096 位 and Base64 编码 . 下面列出了一个示例:

"ZpRxHSZHLZ8VfbTlhmWKZWA+CHUBwS6TPeHO6YE4rY01qSNeG5guoOmJIM/LwkoY7fnY7u55j3eeoaLYrO7v2Cjg5jWLNdFmeMlKZmDE+oBy7U+TgBl7m2wg5desGXFzpzqiZuToxFPmTzuLzGpAAI+CoFzc1KV0+krC4xYdob4="

4、在https://wepayonline-util.weneco.io/中验证签名。

5、使用获取的字符串作为 Signature 参数的值。 以下示例显示了完整的 API 请求:

{
   "header"{
        "merchantCode": "MERC_0144544" ,
        "sign":"ZpRxHSZHLZ8VfbTlhmWKZWA+CHUBwS6TPeHO6YE4rY01qSNeG5guoOmJIM/LwkoY7fnY7u55j3eeoaLYrO7v2Cjg5jWLNdFmeMlKZmDE+oBy7U+TgBl7m2wg5desGXFzpzqiZuToxFPmTzuLzGpAAI+CoFzc1KV0+krC4xYdob4=",
        "signType" : "SHA256"
      };
     "body":{
         "outTradeId":"MERC_0144544_TX_12313213113",
         "coinCode":"WCG_WCG",
         "subject":"Bag",
         "subjectDetail":"Red Color Bag.",
         "notifyUrl":"http://example.com/notify-url",
         "returnUrl":"http://example.com/return-url",
         "totalAmount":20.3144
     }
 }

验证签名

收到响应后,请执行以下步骤以验证签名:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqnYVj6qcyYIRUkUtS9SckUtm4
9LTnXWjFFpfXXnuwnKTnXCev42eEt2WVPDlgXrer9OvSbEu5J0MUsLOhnwAlgLqc
57DHjrQGM31/bvtignIGNoLPVrNdbVQvX0HkEtmIHOyUujHo7OIxdJ5NtLA69/mG
4YiVZ7m4WMn7JeZYIwIDAQAB
-----END PUBLIC KEY-----

使用WEN Gateway公钥验证响应中的签名。
{
    "status": "success",
    "data": {
        "token": "06e56125-58d9-4634-8e93-57d139437f18",
        "outTradeId":"MERC_0144544_TX_12313213113",
        "coinCode": "WCG_WCG",
        "totalAmount": 20.3144,
        "tradeStatus": "TRADE_CREATED",
        "sign": "oUTNYTkA369FtvERmo3Ct/YtJYv5qM8Q1bDP8acnEoaySisCbgwFoknDHJ1Y7DkUOd7UKR93c7Vf0xnj94Yh1r40nenfHwtuHHBXWOU+wAhS7fuWJ8eWsiPVPHTIgzBTXj+/c0sgYTAXg014G4oX+hAdaceSngmrnzd+Xn7fbVc="
    }
}
Last Updated: 5/29/2020, 8:08:20 AM