签名算法

PAYJS 签名算法与微信官方签名算法一致

签名生成的通用步骤如下:

设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

在stringA最后拼接上&key=密钥得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值

特别注意以下重要规则:

参数名ASCII码从小到大排序(字典序);

如果参数的值为空不参与签名;

参数名区分大小写;

验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。

PAYJS接口可能增加字段,验证签名时必须支持增加的扩展字段

举例

例如传递的参数如下:

mchid: 12345

total_fee: 1

out_trade_no: 123123123123

第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下

mchid=12345&out_trade_no=123123123123&total_fee=1

第二步:对上一步中的字符串拼接&key=密钥

mchid=12345&out_trade_no=123123123123&total_fee=1&key=xxxxxxxxx

第三步:对上一步中字符串取MD5值

$sign = md5('mchid=12345&out_trade_no=123123123123&total_fee=1&key=xxxxxxxxx');

第四步:对上面md5值转化为大写

$sign = strtoupper($sign);

代码示例

// 签名方法

function sign(array $data, $key){

ksort($data);

$sign = strtoupper(md5(urldecode(http_build_query($data)).'&key='.$key));

return $sign;

}

// 用法示例

$data = [

'mchid' => '12345',

'total_fee' => 1,

'out_trade_no' => '123123123123',

];

// PAYJS通信密钥

$key = 'xxxxxxxxxxx';

$sign = sign($data, $key);

php

// 签名方法

function sign(array $data, $key){

ksort($data);

$sign = strtoupper(md5(urldecode(http_build_query($data)).'&key='.$key));

return $sign;

}

// 用法示例

$data = [

'mchid' => '12345',

'total_fee' => 1,

'out_trade_no' => '123123123123',

];

// PAYJS通信密钥

$key = 'xxxxxxxxxxx';

$sign = sign($data, $key);

python

# !/usr/bin/env Python3

# -*- coding: utf-8 -*-

import hashlib

from urllib.parse import urlencode,unquote

'''

签名算法

'''

# 签名算法

def sign(attributes, key):

attributes_new = {k: attributes[k] for k in sorted(attributes.keys())}

return hashlib.md5((unquote(urlencode(attributes_new))+'&key='+key)

.encode(encoding='utf-8')).hexdigest().upper()

# 用法示例

data = {

'mchid' : '12345',

'total_fee' : 1,

'out_trade_no' : '123123123123'

}

# PAYJS通信密钥

key = 'xxxxxxxxxxx'

sign = sign(data, key)

go

package main

import (

"crypto/md5"

"encoding/hex"

"fmt"

"net/url"

"sort"

"strings"

)

// 签名算法

func sign(order map[string]string,key string)(sign string) {

data := url.Values{}

for k,v :=range order{

data.Add(k,v)

}

keys := make([]string, 0, 0)

for key := range data{

if data.Get(key) != ""{

keys = append(keys,key)

}

}

sort.Strings(keys)

body := data.Encode()

d,_ := url.QueryUnescape(body)

d += "&key=" + key

h := md5.New()

h.Write([]byte(d))

return strings.ToUpper(hex.EncodeToString(h.Sum(nil)))

}

func main() {

// 用法示例

data := map[string]string{

"mchid":"12345",

"total_fee":"1",

"out_trade_no":"123123123123"}

// PAYJS通信密钥

key := "xxxxxxxxxxx"

sign := sign(data,key)

fmt.Println(sign)

}

java

package com.hello.sign;

import org.springframework.util.DigestUtils;

import java.util.*;

public class Sign_java{

//签名算法

static class sign{

String sign(Map map,String key){

StringBuilder sb = new StringBuilder();

for(Map.Entry entry : map.entrySet()){

sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");

}

sb.append("key=").append(key);

return DigestUtils.md5DigestAsHex(sb.toString().getBytes()).toUpperCase();

}

}

public static void main(String[] args){

// 用法示例

Map order = new TreeMap();

order.put("mchid", "12345");

order.put("total_fee", "1");

order.put("out_trade_no", "123123123123");

// PAYJS通信密钥

String key = "xxxxxxxxxxx";

sign s = new sign();

String sign = s.sign(order,key);

System.out.println(sign);

}

}

node

const crypto = require('crypto')

// PAYJS商户号和通信密钥

const mchid = 'xxxxxxxx'

const key = 'xxxxxxxxxx'

// 排序后转换为字符串

const toQueryString = (obj) => Object.keys(obj)

.filter(key => key !== 'sign' && obj[key] !== undefined && obj[key] !== '')

.sort()

.map(key => {

if (/^http(s)?:\/\//.test(obj[key])) { return key + '=' + encodeURI(obj[key]) }

else { return key + '=' + obj[key] }

})

.join('&')

// md5

const md5 = (str, encoding = 'utf8') => crypto.createHash('md5').update(str, encoding).digest('hex')

// 构造请求数据

let params = {

'body': '商品名称',

'total_fee': 1,

'out_trade_no': '123456',

'mchid': ''

}

params = toQueryString(params)

params += '&key=' + key

// 计算出最终签名

const sign = md5(params).toUpperCase()

console.log(sign)

c

#include

#include

#include

#include

#include "md5.cpp"

using namespace std;

string sign(map data,string key);

string md5(string strPlain);

int main (){

// 用法示例

map data = {

{ "mchid", "12345" },

{ "total_fee", "1" },

{ "out_trade_no", "123123123123" } };

// PAYJS通信密钥

const string key = "xxxxxxxxxxx";

string s = sign(data,key);

cout<

return 0;

}

// 签名方法

string sign(map data,const string key){

string s = "";

while (!data.empty())

{

s+=data.begin()->first+"="+data.begin()->second+"&";

data.erase(data.begin());

}

s+="key="+key;

s = md5(s);

transform(s.begin(),s.end(),s.begin(),::toupper);

return s;

}

string md5(string strPlain){

MD5_CTX mdContext;

int bytes;

unsigned char data[1024];

MD5Init(&mdContext);

MD5Update(&mdContext, (unsigned char*)const_cast(strPlain.c_str()), strPlain.size());

MD5Final(&mdContext);

string md5;

char buf[3];

for (int i = 0; i < 16; i++)

{

sprintf(buf, "%02x", mdContext.digest[i]);

md5.append(buf);

}

return md5;

}

PAYJS提供了验签辅助工具可以在线验证签名准确性

powered by Gitbook最后更新:

2020-07-28

php js sdk 签名算法,签名算法 · PAYJS API 开发文档相关推荐

  1. 如何使用融云地图,文件等插件--融云 Android SDK 2.8.0+ Extension 开发文档

    转载自融云 Android SDK 2.8.0+ Extension 开发文档 融云 SDK 2.8.0 后对 会话界面输入区域.+号扩展区域.语音消息.Emoji 等进行了优化和重构,重构后上列区域 ...

  2. 不动产登记证识别API开发文档

    不动产登记证识别API开发文档 一.接口简介 1.版权说明: 未经翔云人工智能开放平台授权,不得擅自进行使用. 2.调用客户端运行环境 当客户端使用的编程语言为Java时,请使用1.5及以上版本JRE ...

  3. 手机号实名认证增强版API开发文档

    手机号实名认证增强版API开发文档 一.接口简介 1.版权说明: 未经翔云人工智能开放平台授权,不得擅自进行使用. 2.调用客户端运行环境 当客户端使用的编程语言为Java时,请使用1.5及以上版本J ...

  4. 银行卡实名认证标准版API开发文档

    银行卡实名认证标准版API开发文档 一.接口简介 1.版权说明: 未经翔云人工智能开放平台授权,不得擅自进行使用. 2.调用客户端运行环境 当客户端使用的编程语言为Java时,请使用1.5及以上版本J ...

  5. 银行卡实名认证增强版API开发文档

    银行卡实名认证增强版API开发文档 一.接口简介 1.版权说明: 未经翔云人工智能开放平台授权,不得擅自进行使用. 2.调用客户端运行环境 当客户端使用的编程语言为Java时,请使用1.5及以上版本J ...

  6. 最新抖音快手小红书西瓜全平台解析接口api开发文档

    简介:从短视频平台APP中复制出来的分享链接,通过接口获取或通过主页在线一键解析获取短视频中的:视频标题.视频封面.无水印视频地址.图集列表等参数信息 接口地址: https://eeapi.cn/ ...

  7. ujquery.fancybox api开发文档中文翻译版

    2016年11月17日11:57:14 基础使用 http://fancybox.net/howto 1. 首先,请确保您使用的是有效的DOCTYPE这是FancyBox看起来和功能正确需要. 2. ...

  8. 发票查验|身份证实名认证增强版API开发文档

    一.接口简介 1.版权说明: 未经翔云人工智能开放平台授权,不得擅自进行使用. 2.调用客户端运行环境 当客户端使用的编程语言为Java时,请使用1.5及以上版本JRE. 3.服务主要功能描述 翔云身 ...

  9. 企业工商信息查询API开发文档

    服务主要功能描述 企业工商信息查询增强版服务(翔云),实时联网权威数据源,通过企业(个体)名称.企业信用代码查询工商信息,当天注册信息,次日可查.返回的字段包含企业及个体营业执照照面信息.经营状态.曾 ...

最新文章

  1. Spring入门第十三课
  2. 源代码提交SOP(Git版)
  3. C# JsonHelper
  4. java利用循环打印AVA,JAVA语言-AVA文件流
  5. 【STM32 .Net MF开发板学习-28】中文显示(WPF方式)
  6. C#图解教程读书笔记(结构)
  7. POJ1164 The Castle【DFS】
  8. APICloud学习笔记之div样式设置套路
  9. mysql 5.6的安装
  10. Apache JMeter 5.1.1 发布,压力测试工具
  11. Java学习 DAY18 Map、File、IO流
  12. 微信小程序实时定位的要做的那些事,你学废了吗?(附示例)
  13. 华为交换机根据已知一个IP查他对应的MAC地址和交换机端口命令
  14. java线程栅栏_用栅栏(CyclicBarrier)实现高并发测试
  15. 鼠标悬停放大图片特效
  16. 卷积自编码器(Convolutional Autoencoder)的一个实验
  17. leetcode 2203 单源最短路中转
  18. layui下拉框联动查询效果
  19. 【电商专享】聚划算活动海量商品一键报名,省时省力!
  20. Java生鲜电商平台-App系统架构开发与设计

热门文章

  1. 【人工智能AI】AI写作:《怎样成为一个优秀的架构师》
  2. CSS颜色属性、文本文字属性、属性继承
  3. .vm后缀的文件是什么?
  4. 阿里校招 数据分析师 笔试题
  5. Recheck Cond filter IO\CPU放大 原理与优化CASE - 含 超级大表 不包含(反选) SQL优化
  6. Pycharm中c、m、F、f、v、p分别代表什么含义
  7. Aliyun 学习笔记(二)阿里云物联网平台介绍
  8. 100%BIM学员的疑惑:不会CAD可以学Revit吗?
  9. python输出26个大写字母_python 一句话输出26个英文字母
  10. 主板有电无法启动_电脑主板有电 但是就是开不了机