本文,其他语言的开发者请绕开,用SDK直接解决!!
这里先说一下,加密时要用的不是AESKey,而是AppID。
然后,我们在做消息回复加密时,要用到一个签名,
验证方式:
1. 开发者计算签名,dev_msg_signature=sha1(sort(Token、timestamp、nonce, msg_encrypt))
2. 比较dev_msg_signature和URL上带的msg_signature是否相等,相等则表示验证通过。
解密方式如下:
原文这样写的。正常的做法我们都是用TStringList进行排序,先 Add,然后 sort 最后再进行SHA。OK,这是正确的做法。
但是,在某些情况下,Delphi Sort之后的结果会和微信公众号的Sort结果不同(准确的来说应该是其他语言)。
所以我有时加密,签名后回复消息,有时回复得了,有时回复不了。用开发者开具调试后发现,提示这个,原来是签名错了,再之后才发现是Delphi Sort的问题!
解决方法是用TStringList的自定义排序,
Delphi里自义定排序的定义 procedure TStringList.CustomSort(Compare: TStringListSortCompare); begin if not Sorted and (FCount > 1) then begin Changing; QuickSort(0, FCount - 1, Compare); Changed; end; end; TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer; 我这样定义 function Compare(List: TStringList; Index1, Index2: Integer): Integer; var S1, S2: string; begin S1 := List[Index1]; S2 := List[Index2]; Result := CompareStr(S1, S2) //注意不是CompareText, CompareStr 区分大小写; CompareText 不区分大小写. end; 然后不调用 Sort,调用的是 Strlist.CustomSort(Compare);