创建订单
请求地址:http://orderapi.liangtouyang.com/api/orders/pay
请求名 | 类型 | 参考值 | 备注 | |
appid | String | 100010000 | 后台应用中心获取 | |
type | int | 0 | 0:微信支付 1:支付宝支付 | |
out_trade_no | string | Y1234567989 | 用户订单号 | |
money | string | 1.00 | 付款金额,注意必须是标准的金额格式如1.00 1.01 | |
notify_url | string | 可填可不填 不填则用后台应用内设置的为准 | ||
device | int | 1 | 1:电脑 2:手机 填写的类型会利于接口的返回类型 | |
sign | string | 32位的MD5加密字符串 |
|
计算签名
import Data.Digest.Pure.MD5 (md5, digestToHexString)
import Data.List (sort)
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Maybe (fromMaybe)
generateSign :: Map String String -> String -> String
generateSign params secretKey =
let params' = Map.delete "sign" params
sortedParams = Map.toList (Map.fromList (sort (Map.toList params')))
paramString = concatMap (\(k, v) -> k ++ "=" ++ v ++ "&") sortedParams
stringToSign = paramString ++ secretKey
in digestToHexString (md5 (stringToSign :: String))
main :: IO ()
main = do
let parameters = Map.fromList [
("appid", "100010000"),
("type", "0"),
("out_trade_no", "Y1234567989"),
("money", "1.00"),
("notify_url", ""),
("device", "1")
]
secretKey = "your_secret_key_here"
sign = generateSign parameters secretKey
putStrLn sign
查询订单
请求地址:http://orderapi.liangtouyang.com/api/orders/query
请求名 | 类型 | 参考值 | 备注 | |
appid | string | 100010000 | 后台应用处获取 | |
out_trade_no | string | Y123456789 | 用户自己订单号 (二选一) | |
trade_no | string | R201400000000000000 | 平台订单号(二选一) |
// 查询订单 无需sign计算
验证回调签名
import Data.Digest.Pure.MD5 (md5, digestToHexString)
import Data.List (sort)
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Maybe (fromMaybe)
verifyCallbackSignature :: Map String String -> String -> Bool
verifyCallbackSignature data secretKey =
let signature = fromMaybe "" (Map.lookup "sign" data)
data' = Map.delete "sign" data
sortedData = Map.toList (Map.fromList (sort (Map.toList data')))
paramString = concatMap (\(k, v) -> k ++ "=" ++ v ++ "&") sortedData
stringToSign = paramString ++ secretKey
computedSignature = digestToHexString (md5 (stringToSign :: String))
in map toLower signature == map toLower computedSignature
main :: IO ()
main = do
let data = Map.fromList [
("appid", "100100001"),
("time", "1713760397"),
("amount", "1.100"),
("status", "1"),
("out_trade_no", "y1713760297"),
("trade_no", "R240422123135450090"),
("sign", "a7762b869a349409616ed4cbc5018dae")
]
secretKey = "your_secret_key_here"
isValid = verifyCallbackSignature data secretKey
putStrLn (if isValid then "签名验证通过" else "签名验证失败")
进件地址:两头羊支付