h5网站内,调用微信支付。
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript">
function pay() {
$.ajax({
async: false,
cache: false,
type: 'POST',
url: "https://ztcapi.yzsheng.com/Try/WeChatIndex", //请求的action路径
success: function (data) {
alert(data.item);
window.location.href = data.item;
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest.status);
console.log(XMLHttpRequest.readyState);
console.log(textStatus);
}
});
};
</script>
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using System.Xml.Linq;
namespace WebApplication1.Common.PayHelper
{
///
/// H5微信支付封装
///
public static class H5PayHepler
{
static string _pre_order_url = "https://api.mch.weixin.qq.com";//请求域名
static string _appid = "";//公众账号ID
static string _mch_id = "";//商户号
static string _partnerKey = "";//商家私钥,在微信支付中设置
///
/// H5微信支付
///
///
#region 微信支付
public static string WeChatIndex()
{
#region 下单
var _attach = "支付测试";
var _body = "H5支付测试";
var _nonce_str = CreateNonce_str(); //随机字符串
var _notify_url = ""; //回调地址
var _out_trade_no = Guid.NewGuid().ToString("N"); //订单号
var _spbill_create_ip = GetWebClientIp(); //终端ip
var _total_fee = 0.01;//元为单位
var _scene_info = $@"{{""h5_info"": {{""type"":""Wap"",""wap_url"": ""{_notify_url}"",""wap_name"": ""{_body}""}}}}"; //场景参数
var _time_start = DateTime.Now.ToString("yyyyMMddHHmmss"); //请求开始时间
var _time_expire = DateTime.Now.AddHours(1).ToString("yyyyMMddHHmmss"); //请求结束时间
var _trade_type = "MWEB"; //请求类型
var pre_order_httpResult = UnifiedOrder(_appid, _attach, _body, _mch_id, _nonce_str, _notify_url, _out_trade_no, _spbill_create_ip, _total_fee,
_trade_type, _scene_info, _time_start, _time_expire); //下单
var pre_order_resultStr = XElement.Parse(pre_order_httpResult);
var pre_order_result_code = pre_order_resultStr.Element("return_code").Value;
var pre_order_result_msg = pre_order_resultStr.Element("return_msg").Value;
if (pre_order_result_code == "SUCCESS")
{
var pre_order_result_mweb_url = pre_order_resultStr.Element("mweb_url").Value;
return pre_order_result_mweb_url;
}
#endregion
return string.Empty;
}
///
/// 下单
///
/// 公众账号ID
/// 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
/// String(32) 商品描述 商品或支付单简要描
/// 商户号
/// 随机字符串
/// 接收微信支付异步通知回调地址,不可带参,与下面的Notify对应,开发者可自定义其他url地址
/// 商户系统内部的订单号,32个字符内、可包含字母
/// 终端ip
/// 收钱总额 分为单位 前台传过来后需要处理成分
/// 交易类型H5支付的交易类型为MWEB
/// 场景信息 WAP网站应用{"h5_info": {"type":"Wap","wap_url": "https://pay.qq.com","wap_name": "腾讯充值"}}
/// 交易起始时间
/// 交易结束时间
///
static string UnifiedOrder(string appid, string attach, string body, string mch_id, string nonce_str, string notify_url, string out_trade_no,
string spbill_create_ip, double total_fee, string trade_type, string scene_info, string time_start, string time_expire)
{
var stringADict = new Dictionary<string, string>();
stringADict.Add("appid", appid);
stringADict.Add("attach", attach);
stringADict.Add("body", body);
stringADict.Add("mch_id", mch_id);
stringADict.Add("nonce_str", nonce_str);
stringADict.Add("notify_url", notify_url);
stringADict.Add("out_trade_no", out_trade_no);
stringADict.Add("spbill_create_ip", spbill_create_ip);
stringADict.Add("total_fee", Math.Round(Convert.ToDecimal(total_fee) * 100, 0).ToString());//元转分
stringADict.Add("trade_type", trade_type);
stringADict.Add("scene_info", scene_info);
stringADict.Add("time_start", time_start);
stringADict.Add("time_expire", time_expire);
var sign = Sign(stringADict, _partnerKey);//生成签名字符串
//组合xml内容
StringBuilder strBuilder = new StringBuilder();
strBuilder.Append("" );
strBuilder.Append($"{appid} ");//公众号id
strBuilder.Append($"{attach} ");//附加数据
strBuilder.Append($"{body}");//商品描述
strBuilder.Append($"{mch_id} ");//商户号
strBuilder.Append($"{nonce_str} ");//随机字符串
strBuilder.Append($"{notify_url} ");//接收微信支付异步通知回调地址,不可带参,与下面的Notify对应,开发者可自定义其他url地址
strBuilder.Append($"{out_trade_no} ");//商户系统内部的订单号,32个字符内、可包含字母
strBuilder.Append($"{spbill_create_ip} ");//终端ip
strBuilder.Append($"{Math.Round(Convert.ToDecimal(total_fee) * 100, 0).ToString()} ");//收钱总额 分为单位 前台传过来后需要处理成分
strBuilder.Append($"{trade_type} ");//交易类型H5支付的交易类型为MWEB
strBuilder.Append($"{scene_info} ");
strBuilder.Append($"{time_start} ");//交易起始时间
strBuilder.Append($"{time_expire} ");//交易结束时间
strBuilder.Append($"{sign} ");
strBuilder.Append("");
//var url = _pre_order_url + "/sandboxnew/pay/unifiedorder";//沙箱
var url = _pre_order_url + "/pay/unifiedorder";
var pre_order_httpResult = HttpPostRequestXml(url, strBuilder);
return pre_order_httpResult;
}
///
/// 查询订单
///
/// 公众账号ID
/// 商户号
/// 商户系统内部的订单号或微信的订单号
/// 随机字符串
///
static string Orderquery(string appid, string mch_id, string out_trade_no, string nonce_str)
{
var stringADict = new Dictionary<string, string>();
stringADict.Add("appid", appid);
stringADict.Add("mch_id", mch_id);
stringADict.Add("out_trade_no", out_trade_no);
stringADict.Add("nonce_str", nonce_str);
var sign = Sign(stringADict, _partnerKey);//生成签名字符串
//组合xml内容
StringBuilder strBuilder = new StringBuilder();
strBuilder.Append("" );
strBuilder.Append($"{appid} ");
strBuilder.Append($"{mch_id} ");
strBuilder.Append($"{out_trade_no} ");
strBuilder.Append($"{nonce_str} ");
strBuilder.Append($"{sign} ");
strBuilder.Append("");
var url = _pre_order_url + "/pay/orderquery";
var pre_order_httpResult = HttpPostRequestXml(url, strBuilder);
return pre_order_httpResult;
}
///
/// 发送post xml文件请求
///
///
///
///
static string HttpPostRequestXml(string Url, StringBuilder strBuilder)
{
string result = string.Empty;
string data = strBuilder.ToString();
//进行utf-8编码
var encoding = Encoding.GetEncoding("utf-8");
byte[] buffer = encoding.GetBytes(data);
//根据webURL创建HttpWebRequest对象
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "post";
//request.Headers.Add("charset:utf-8");
request.ContentLength = buffer.Length;
request.ContentType = "text/xml";
StreamWriter myWriter = null;
try
{
myWriter = new StreamWriter(request.GetRequestStream());
myWriter.Write(data);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
myWriter.Close();
}
//读取服务器返回的信息
HttpWebResponse objResponse = (HttpWebResponse)request.GetResponse();
using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
{
result = sr.ReadToEnd();
}
return result;
}
private static string[] strs = new string[]
{
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
};
///
/// 创建随机字符串
///
///
public static string CreateNonce_str()
{
Random r = new Random();
var sb = new StringBuilder();
var length = strs.Length;
for (int i = 0; i < 15; i++)
{
sb.Append(strs[r.Next(length - 1)]);
}
return sb.ToString();
}
///
/// 获取终端IP地址
///
///
public static string GetWebClientIp()
{
string userIP = "";
try
{
if (System.Web.HttpContext.Current == null
|| System.Web.HttpContext.Current.Request == null
|| System.Web.HttpContext.Current.Request.ServerVariables == null)
return "";
string CustomerIP = "";
//CDN加速后取到的IP simone 090805
CustomerIP = System.Web.HttpContext.Current.Request.Headers["Cdn-Src-Ip"];
if (!string.IsNullOrEmpty(CustomerIP))
{
return CustomerIP;
}
CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!String.IsNullOrEmpty(CustomerIP))
{
return CustomerIP;
}
if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
{
CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (CustomerIP == null)
CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
else
{
CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
if (string.Compare(CustomerIP, "unknown", true) == 0)
return System.Web.HttpContext.Current.Request.UserHostAddress;
return CustomerIP;
}
catch { }
return userIP;
}
///
/// 生成签名
/// 签名在线验证工具:
/// http://mch.weixin.qq.com/wiki/tools/signverify/
///
/// 参与签名生成的参数列表
/// 商家私钥
///
public static string Sign(IDictionary<string, string> stringADict, string partnerKey)
{
var sb = new StringBuilder();
foreach (var sA in stringADict.OrderBy(x => x.Key))//参数名ASCII码从小到大排序(字典序);
{
if (string.IsNullOrEmpty(sA.Value)) continue;//参数的值为空不参与签名;
if (string.Compare(sA.Key, "sign", true) == 0) continue; // 参数中为签名的项,不参加计算
sb.Append(sA.Key).Append("=").Append(sA.Value).Append("&");
}
var string1 = sb.ToString();
string1 = string1.Remove(string1.Length - 1, 1);
sb.Append("key=").Append(partnerKey);//在stringA最后拼接上key=(API密钥的值)得到stringSignTemp字符串
var stringSignTemp = sb.ToString();
var sign = MD5Encrypt(stringSignTemp, "UTF-8").ToUpper();//对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
return sign;
}
///
/// 用MD5加密字符串
///
/// 待加密的字符串
///
public static string MD5Encrypt(string password, string encoding)
{
MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
byte[] hashedDataBytes;
hashedDataBytes = md5Hasher.ComputeHash(Encoding.GetEncoding(encoding).GetBytes(password));
StringBuilder tmp = new StringBuilder();
foreach (byte i in hashedDataBytes)
{
tmp.Append(i.ToString("x2"));
}
return tmp.ToString();
}
#endregion
}
}
注:部分转载于CSDN论坛,部分为自己研究所写