local http = require("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 = "" for k,v in pairs(data) do xml_data = xml_data .. "<" .. k .. ">" .. v .. "" end xml_data = xml_data .. "" 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,"") if result_code ~= "SUCCESS" then return false,extract_between(res,"") end local prepay_id = extract_between(res,"") 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