Files
daydaytalk-fwutils/target/tencent/wxpay.lua
2026-01-08 21:58:41 +08:00

102 lines
2.8 KiB
Lua

local http = require("fwutils.httpclient")
local M = {}
-- 微信支付统一下单
local url_pay = "https://api.mch.weixin.qq.com/pay/unifiedorder"
-- 纯文本方式取中间内容(不使用正则)
function extract_between(text, start_str, end_str)
local start_pos = string.find(text, start_str, 1, true)
if not start_pos then return nil end
local from = start_pos + #start_str
local end_pos = string.find(text, end_str, from, true)
if not end_pos then return nil end
return string.sub(text, from, end_pos - 1)
end
-- 验签
M.sign = function(data,key)
local sign_str = ""
local keys = {}
for k,_ in pairs(data) do
table.insert(keys, k)
end
table.sort(keys)
for i,k in ipairs(keys) do
if i > 1 then
sign_str = sign_str .. "&"
end
sign_str = sign_str .. k .. "=" .. data[k]
end
sign_str = sign_str .. "&key=" .. key
return string.upper(codec.md5(sign_str))
end
-- 微信支付统一下单
M.unified_order = function(appid,mch_id,openid,key,body,out_trade_no,total_fee,notify_url)
function xml_make(data)
local xml_data = "<xml>"
for k,v in pairs(data) do
xml_data = xml_data .. "<" .. k .. ">" .. v .. "</" .. k .. ">"
end
xml_data = xml_data .. "</xml>"
return xml_data
end
local data = {
appid = appid,
body = body,
mch_id = mch_id,
nonce_str = fw.make_software_guid(),
notify_url = notify_url,
openid = openid,
out_trade_no = out_trade_no,
spbill_create_ip = request.remote_ipaddress(),
total_fee = total_fee,
trade_type = "JSAPI",
}
data.sign = M.sign(data,key)
-- 生成XML
local xml_data = xml_make(data)
-- print("================xml_request=================")
-- print(appid,"|",mch_id,"|",openid,"|",key,"|",body,"|",out_trade_no,"|",total_fee,"|",notify_url)
-- print(xml_data)
local result,res = http.post(url_pay,{
["Content-Type"] = "text/xml",
}, xml_data)
if not result then
return false,"request error"..res
end
-- print("============res=============")
-- print(res)
-- 取中间文本
local result_code = extract_between(res,"<result_code><![CDATA[","]]></result_code>")
if result_code ~= "SUCCESS" then
return false,extract_between(res,"<err_code_des><![CDATA[","]]></err_code_des>")
end
local prepay_id = extract_between(res,"<prepay_id><![CDATA[","]]></prepay_id>")
local result_data = {
appId = appid,
nonceStr = fw.make_software_guid(),
package = "prepay_id=" .. prepay_id,
signType = "MD5",
timeStamp = string.format("%d",os.time())
}
result_data["paySign"] = M.sign(result_data,key)
return true,result_data
end
return M