编辑代码

-module(extractor).
-export([extract_values/1,md5/1,decode_url/1]).

extract_values(DecodedUrl) ->
    %% 提取 nt_data 值
    NtDataStart = string:str(DecodedUrl, "nt_data=") + 8, % "+9" 是因为 "nt_data=" 长度为 9
    NtDataEnd = string:str(DecodedUrl, "&sign=") - 1, % "&sign=" 是下一个参数的开始
    NtData = string:substr(DecodedUrl, NtDataStart, NtDataEnd - NtDataStart + 1),

    %% 提取 sign 值
    SignStart = string:str(DecodedUrl, "&sign=") + 6, % "+6" 是因为 "&sign=" 长度为 6
    SignEnd = string:str(DecodedUrl, "&md5Sign=") - 1, % "&md5Sign=" 是下一个参数的开始
    Sign = string:substr(DecodedUrl, SignStart, SignEnd - SignStart + 1),

    %% 提取 md5Sign 值
    Md5SignStart = string:str(DecodedUrl, "&md5Sign=") + 9, % "+10" 是因为 "&md5Sign=" 长度为 10
    Md5Sign = string:substr(DecodedUrl, Md5SignStart, string:len(DecodedUrl) - Md5SignStart + 1),

    {NtData, Sign, Md5Sign}.

%% @spec to_lower(Str) -> Str2
%% Str = string()
%% Str2 = string()
%% @doc 转换为小写字符
to_lower(Str) ->
    to_lower(Str, []).
to_lower([C|Cs], Acc) when C >= $A, C =< $Z ->
    to_lower(Cs, [C+($a-$A)| Acc]);
to_lower([C|Cs], Acc) ->
    to_lower(Cs, [C| Acc]);
to_lower([], Acc) ->
    lists:reverse(Acc).

%% 将整数列表转换为十六进制字符串
list_to_hex(L) ->
    lists:map(fun(X) -> int_to_hex(X) end, L).

%% 将整数转换为十六进制字符
int_to_hex(N) when N < 256 ->
    [hex(N div 16), hex(N rem 16)].

%% 将数字转换为十六进制字符
hex(N) when N < 10 ->
    $0 + N;
hex(N) when N >= 10, N < 16 ->
    $a + (N - 10).

%% @doc 生成16位格式的md5值
-spec md5(iodata()) -> binary().
md5(Data) ->
    list_to_binary([io_lib:format("~2.16.0b",[N]) || N <- binary_to_list(erlang:md5(Data))]).

decode_url(ReqBody) ->
    case http_uri:decode(ReqBody) of
        {error, _} ->
            %% 处理解码错误
            "Error decoding URL";
        DecodedUrl ->
            DecodedUrl
    end.


%% 将字符串转换为十六进制表示
hex_encode(Bin) ->
    lists:flatten([io_lib:format("~2.16.0b", [X]) || X <- binary_to_list(Bin)]).
    
main(_) ->
    ReqBody = "nt_data=%40117%40120%40176%40161%40165%4080%40171%40150%40164%40171%40160%40162%40164%40116%4083%4099%40102%4096%4084%4082%40150%40158%40149%40160%40152%40156%40167%40160%40110%4084%40138%40133%40127%40102%40112%4086%4089%40163%40169%40146%40160%40156%40152%40159%40165%40165%40150%40111%4090%40158%40161%4084%40112%40110%40110%40162%40169%40156%40156%40164%40144%40159%40154%40164%40172%40154%40159%40153%40119%40108%40162%40150%40165%40171%40152%40154%40155%40117%40109%40167%40161%40148%40112%4099%40106%4099%40103%4099%40108%40104%40113%40113%40109%4097%40170%40154%40157%40119%40116%40160%40168%40151%40158%40159%40145%40166%40152%40160%40155%40117%40171%40162%40107%4097%40104%40106%40103%4099%40107%40105%40112%4098%40165%40168%40152%40155%40163%40144%40167%40154%40165%40153%40119%40108%40164%40166%40166%40151%40166%40165%40154%40156%40163%40145%40166%40159%40112%40110%4096%40159%40167%40165%40147%40162%40171%40157%40150%40164%40148%40159%40168%40119%40116%40163%40171%40148%40154%40163%40145%40166%40166%40113%40102%40104%4099%4098%40106%40100%4099%40100%4097%4099%40100%4099%40101%40102%40105%40110%40103%40107%40102%40106%40109%40113%40116%4099%40168%40162%40153%40150%40164%40151%40165%40162%40116%40115%40161%40147%40177%40143%40166%40155%40158%40149%40112%4099%40100%40101%40109%40102%4098%40100%4098%4097%40108%4089%40106%40102%40115%4097%40104%40107%4099%40106%40115%4098%40166%40152%40170%40145%40172%40153%40159%40151%40111%40108%40147%40158%40163%40168%40167%40173%40111%4099%4099%4097%40105%40117%40103%40149%40166%40159%40170%40159%40166%40118%40115%40166%40170%40152%40165%40167%40171%40110%4098%40110%4096%40163%40166%40146%40168%40168%40172%40119%40109%40151%40173%40165%40171%40154%40171%40147%40169%40145%40167%40146%40159%40171%40117%40101%40106%40107%4085%4086%40153%40156%40155%40171%40166%40158%4086%4085%40100%4087%4093%40170%40166%40155%40152%40156%40160%40154%40165%40153%4093%4084%40104%4097%4099%4092%4091%40100%40283%40188%40180%40281%40220%40236%40279%40190%40182%4084%4086%40109%4099%40152%40177%40173%40163%40147%40168%40144%40169%40154%40170%40149%40166%40163%40115%40109%4097%40165%40156%40166%40169%40152%40152%40151%40118%40108%4097%40163%40166%40153%40149%40156%40147%40160%40158%40172%40164%40147%40156%40150%40119&sign=%40105%40105%40104%40102%40113%40150%40104%40105%40103%40154%40154%40102%40102%40152%40146%40151%40158%40150%40150%40106%40104%4098%40150%40150%40108%40101%40111%40107%40150%40152%40151%40147&md5Sign=da7789528fe2d6666fa221fd4fb02a9f",
    DecodedUrl = decode_url(ReqBody),
    {NtData, Sign, Md5Sign} = extract_values(DecodedUrl),
    io:format("abcdefg===~s~n", [NtData]),
    io:format("abcdefg===~s~n", [Sign]),
    io:format("Md5Sign===~s~n", [Md5Sign]),
    %% io:format("abcdefg===~s~n", [NtData ++ Sign ++ "24524136000672962283204644567170"]),
    %% io:format("abcdefg===~s~n", [lists:concat([NtData, Sign, "24524136000672962283204644567170"])]),
    LocalSign = md5(NtData ++ Sign ++ "24524136000672962283204644567170"),
    io:format("LocalSign===~s~n", [LocalSign]),
    Md5SignBin = list_to_binary(Md5Sign),
    case string:equal(LocalSign, Md5SignBin) of
            true ->
                 io:format("LocalSign===ok"),
                 io:format("LocalSign (hex): ~s~n", [hex_encode(LocalSign)]),
                 Md5SignBin = list_to_binary(Md5Sign),
                 %% Strlist = decode(NtData,"99849051287367128022102143991251"),
                 %% io:format("-----------backpay--kk------==~s~n", [Strlist]),
                 io:format("Md5Sign (hex): ~s~n", [hex_encode(Md5SignBin)]);
            false ->
                % 如果字符串不相等,执行另一些操作
                io:format("LocalSign===no")
    end.