分类 coding 下的文章

项目中用到微信支付,但公众号上已有一个第三方的项目配置过v2版,报文用XML格式的那个旧的支付密钥。没找到接口维护人拿不到旧密钥。

为了不影响已有产品,改写V3接口。本觉得V3用JSON应该是收到拿来,数据方便编辑维护多了。没想到还是埋着不少坑。

腾讯官方的技术支持已经不指望也不想吐槽了,概括四字:依托答辩

没多想,找到文档按部就班开始写了

https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml

一开始还挺顺的,觉得接口参数还简化了不少。直到测试提交,下单生成 prepay_id

大意了,来活了。

报错。

{"code":"INVALID_REQUEST","message":"Http头缺少Accept或User-Agent"}

哦,网上搜一下,行~按你要求构造个header补上呗
curl请求的header,定义上

$headers = [
        'Accept: application/json',
        'Content-Type: application/json',
        ];  
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

还是错!

{"code":"SIGN_ERROR","message":"Http头Authorization值格式错误,请参考《微信支付商户REST API签名规则》"}

牛B!都是对header的要求,就不能说明放一块,错误提示放一起,非得像有关部门一样踢一脚说半句。

随即发现这 Authorization 坑有点深.. 过程略过.. 大概知道就是把 V2的签名部分挪到了header里
构造数据、签名、加密、编码一通操作下来
报错

{
  "code":"SIGN_ERROR",
  "detail":{
    "detail":{
      "issue":"sign not match"
    },
    "field":"signature",
    ...
  "message":"Authorization不合法"}

忽略掉过程 N个小时 各种无意义的试错

官方文档牛啤!给的演示代码省略了那么多关键步骤!让开发者自己脑补和发掘隐藏BUG!

要自己解决证书文件换行问题;

openssl_sign(): supplied key param cannot be coerced into a private key

要在文档角落找到获得 serial_no 的方法;
要自己猜接口的数据长度单位是还是字节

卡在最后一个错误节点,终于错误提示不在变动,仅仅是告知

{"code":"SIGN_ERROR","detail":{"detail":{"issue":"sign not match"} ..."message":"签名错误,请检查后再试"}

像玩悬赏解谜游戏一样,找到隐藏的链接 而且我们还提供签名/验签/加密/解密工具(点击下载)
验证自己生成的签名和用工具验证的签名,我™直接傻了,没有不同啊?!

QQ截图20230721013527.png

好家伙,卡在那发呆...又回去检查每个步骤,逐行逐字的看。甚至声明了顺序无关的地方都处女座一样把参数按顺序重排,还是错,直到我看见..

QQ截图20230721014034.png

又看了看自己的签名数据

QQ截图20230721013857.png

我把 post 改成大写 POST 试试...

我草你大爷的!!!大写这么重要的事情怎么不早说?!

客户要做代发微信红包的活动,无一例外地招来黑产的攻击盗刷作弊。
和黑产斗智斗勇内耗严重。

活动数据始终容易被伪造,所以思路最后还是落在增加他们的违法成本上,让其食之无味知难而退。

主要方式是针对可疑的IP建立黑名单机制,因为更换IP或者找寻特定地理位置的代理的IP成本极高,即使它们在目标地区,更换动态IP也能减缓其速度。

需求前提铺垫到此为止,以下是实现过程。

考虑到这种查库存在误差和过时失效等精确度的问题。IP归属地和 手机号码归属地进行结合判定,提高判断结果的可信程度。


- 阅读剩余部分 -

先说结论:只要文件是同个文件,hash是一致的。

Linux

md5sum filepath

#md5sum 01000.chunk 
ae2056ca156511f3a8223e2a4599b7bf  01000.chunk

PHP

md5_file(filename);

<?php
$file = "01000.chunk";
$md5 = md5_file($file);
var_dump($md5);
//string(32) "ae2056ca156511f3a8223e2a4599b7bf"
?>

Python

这个稍微复杂点,要自己实现,而且执行起来效率貌似也有点低。不清楚为何,按理说所有方法都要读取完整文件效率应该相差不大才对,可能是我方法不对。


import hashlib

fname = "01000.chunk"

def md5_file(filename):
    m = hashlib.md5()   #创建md5对象
    with open(filename,'rb') as fobj:
        while True:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)  #更新md5对象
    return m.hexdigest()    

hash = md5_file(fname)
print(hash, fname) 

设想在入群验证的机器人中要求新用户输入特定的成语,由于用户可能来自港澳台或海外地区的华人,所以需要考虑到他们的输入法是繁体的情况。

zhconv 是找到的比较简易的解决办法, 而且 python2 / 3 都有支持

安装方法

pip3 install zhconv

使用

from zhconv import convert

str_big5 = '恭喜發財'
str_zhcn = convert(str_big5, 'zh-hans')
print(str_zhcn)

恭喜发财

参考文

php中对变量类型在很多情况下并不要求严格的类型定义和适配,而是在运算过程中按需尝试自行转换。

$a = 1 + '2' // $a = 3
2 == '2' //true
2 === '2' //false

这带来了一个问题, 作为数据的下标或说key,是否也区分变量类型。
先说结论:是。 看下面演示

$arr[] = '1st val';
$arr[2] = 'int';
$arr["key"] = 'value';
$arr['2'] = 'str';

var_dump($arr);

输出:

array (size=3)
  0 => string '1st val' (length=7)
  2 => string 'str' (length=3)
  'key' => string 'value' (length=5)

$arr[2]$arr['2'] 指的是同一个变量,值被覆盖了。需要注意避免这种情况发生。

*只是为了过笔备忘,没有特别的主旨或价值单独成篇。