|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
using System.Net;
|
|
|
using System.Security.Cryptography;
|
|
|
using System.Security.Cryptography.X509Certificates;
|
|
|
using System.Text;
|
|
|
using System.Web;
|
|
|
using System.Web.Script.Serialization;
|
|
|
using System.Web.UI;
|
|
|
using System.Web.UI.WebControls;
|
|
|
using System.Xml;
|
|
|
using NetLibrary;
|
|
|
using NetLibrary.Log;
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
|
namespace TradeManage
|
|
|
{
|
|
|
public partial class oauth2 : System.Web.UI.Page
|
|
|
{
|
|
|
|
|
|
const string Token = "qianyun"; //你的token
|
|
|
static string appId = "wx2f5849d8aa573da3";//公众号的appId
|
|
|
static string appSecret = "34cc0ed309a8250eed74ea4df0b59fb5";//公众号的appSecret
|
|
|
static string Code = "";
|
|
|
protected void Page_Load(object sender, EventArgs e)
|
|
|
{
|
|
|
if (!IsPostBack)
|
|
|
{
|
|
|
if ((Server.UrlDecode(Page.Request.QueryString["Code"]) != null) && (Server.UrlDecode(Page.Request.QueryString["Code"]) != ""))
|
|
|
{
|
|
|
Code = Request.QueryString["Code"].ToString();
|
|
|
PostUrl();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
public void PostUrl()
|
|
|
{
|
|
|
//string url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx2f5849d8aa573da3&redirect_uri=http://www.mnkj.com/oauth2.aspx&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
|
|
|
|
|
|
string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret + "&code=" + Code + "&grant_type=authorization_code";
|
|
|
string ErrorMessage = "";
|
|
|
string XmlContent = CustomIO.HttpRequest(url, "Get", out ErrorMessage);
|
|
|
if(ErrorMessage!="")
|
|
|
ErrorFollow.TraceWrite("PostUrl", "PostUrl", ErrorMessage);
|
|
|
if (XmlContent != "")
|
|
|
{
|
|
|
//ErrorFollow.TraceWrite("PostUrl", "PostUrl", XmlContent);
|
|
|
JavaScriptSerializer JsonConvert = new JavaScriptSerializer();
|
|
|
weixin_token Model = JsonConvert.Deserialize<weixin_token>(XmlContent);
|
|
|
//string url1 = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN";
|
|
|
if (Model != null)
|
|
|
{
|
|
|
string OpenId = Model.openid;
|
|
|
if (OpenId == "")
|
|
|
return;
|
|
|
int UId = TradeData.BaseService.IsWeiXin(OpenId);
|
|
|
if (UId == -1)
|
|
|
{
|
|
|
Response.Write("<script type='text/javascript'>alert('对不起,您已经领过红包了,不能重复领取!');WeixinJSBridge.call('closeWindow');</script>");
|
|
|
|
|
|
}
|
|
|
else if (UId ==0)
|
|
|
{
|
|
|
Response.Write("<script type='text/javascript'>alert('对不起,红包已经发完,请关注下次活动!');WeixinJSBridge.call('closeWindow');</script>");
|
|
|
|
|
|
}
|
|
|
else if(UId>0)
|
|
|
{
|
|
|
PostPage(OpenId, UId);
|
|
|
}
|
|
|
// ErrorFollow.TraceWrite("OpenId1", "OpenId1", OpenId);
|
|
|
}
|
|
|
//ErrorFollow.TraceWrite("PostUrl", "PostUrl", "access_token:" + Model.access_token + ";refresh_token:" + Model.refresh_token + ";expires_in:" + Model.expires_in.ToString() + ";openid:" + Model.openid);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
|
|
|
{
|
|
|
|
|
|
// ErrorFollow.TraceWrite("OpenId2", "OpenId2", OpenId);
|
|
|
//int UId = TradeData.BaseService.IsWeiXin(OpenId);
|
|
|
// if (UId == -1)
|
|
|
// {
|
|
|
// Response.Write("<script type='text/javascript'>alert('您已经领过红包了!');</script>");
|
|
|
|
|
|
// }
|
|
|
// else
|
|
|
// Response.Redirect("weixin/weixinauth.aspx?OpenId="+OpenId);
|
|
|
|
|
|
}
|
|
|
public void PostPage(string OpenId, int amount)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
|
|
|
|
|
|
PayWeiXin model = new PayWeiXin();
|
|
|
PayForWeiXinHelp PayHelp = new PayForWeiXinHelp();
|
|
|
string result = string.Empty;
|
|
|
//传入OpenId
|
|
|
string openId = OpenId;// "obpqPs0mhCF1GHOiB6ExmyFc4Zzg";
|
|
|
//传入红包金额(单位分)
|
|
|
// Random r = new Random();
|
|
|
|
|
|
// decimal hb = r.Next(100, 200);
|
|
|
//string amount = hb.ToString();
|
|
|
//接叐收红包的用户 用户在wxappid下的openid
|
|
|
model.re_openid = openId;//"oFIYdszuDXVqVCtwZ-yIcbIS262k";
|
|
|
//付款金额,单位分
|
|
|
model.total_amount = amount;
|
|
|
//最小红包金额,单位分
|
|
|
model.min_value = amount;
|
|
|
//最大红包金额,单位分
|
|
|
model.max_value = amount;
|
|
|
//调用方法
|
|
|
string postData = PayHelp.DoDataForPayWeiXin(model);
|
|
|
result = PayHelp.PayForWeiXin(postData);
|
|
|
|
|
|
XmlDocument doc = new XmlDocument();
|
|
|
doc.LoadXml(result);
|
|
|
string jsonResult = JsonConvert.SerializeXmlNode(doc);
|
|
|
|
|
|
|
|
|
if (jsonResult.Contains("SUCCESS")==true)
|
|
|
{
|
|
|
TradeModel.WX_User md = new TradeModel.WX_User();
|
|
|
md.openId = openId;
|
|
|
md.InDate = DateTime.Now;
|
|
|
md.GetMoney = Convert.ToDecimal(amount);
|
|
|
md.GetDate = DateTime.Now;
|
|
|
TradeData.BaseService.SaveWXUser(md);
|
|
|
Response.Write("<script type='text/javascript'>alert('恭喜您,已经成功领取红包,请返回微信查看红包!');WeixinJSBridge.call('closeWindow');</script>");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Response.Write("<script type='text/javascript'>alert('对不起,领取红包失败!');window.close();</script>");
|
|
|
TradeData.BaseService.UseWeiXin(openId);
|
|
|
ErrorFollow.TraceWrite("PostPage", "PostPage", jsonResult);
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
ErrorFollow.TraceWrite("PostPage", "PostPage", ex.Message); //写日志
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
public class weixin_token
|
|
|
{
|
|
|
|
|
|
public string access_token { get; set; }
|
|
|
public Int32? expires_in { get; set; }
|
|
|
public string refresh_token { get; set; }
|
|
|
public string openid { get; set; }
|
|
|
public string scope { get; set; }
|
|
|
|
|
|
}
|
|
|
public class PayForWeiXinHelp
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
/// 调用微信支付接口前处理数据,包括sign验证等
|
|
|
/// </summary>
|
|
|
/// <param name="payForWeiXin"></param>
|
|
|
/// <returns></returns>
|
|
|
public string DoDataForPayWeiXin(PayWeiXin payForWeiXin)
|
|
|
{
|
|
|
#region 处理nonce_str随机字符串,不长于 32 位(本程序生成长度为16位的)
|
|
|
string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
|
payForWeiXin.nonce_str = RandomStr(str, 16);
|
|
|
#endregion
|
|
|
|
|
|
#region 商户信息从config文件中读取
|
|
|
//商户支付密钥key
|
|
|
string key = "0123456789ABCDefghijklmnopqrstuv";
|
|
|
//商户号
|
|
|
payForWeiXin.mch_id = "1245142102";
|
|
|
//商户 appid
|
|
|
payForWeiXin.wxappid = "wx2f5849d8aa573da3";
|
|
|
//提供方名称
|
|
|
payForWeiXin.nick_name = "云界抑菌健康生活馆";
|
|
|
payForWeiXin.act_id = "act_id";
|
|
|
//红包収送者名称
|
|
|
payForWeiXin.send_name = "云界抑菌健康生活馆";
|
|
|
//红包収放总人数
|
|
|
payForWeiXin.total_num = 1;
|
|
|
//红包祝福诧
|
|
|
payForWeiXin.wishing = "欢迎访问云界抑菌优享健康生活";
|
|
|
//活劢名称
|
|
|
payForWeiXin.act_name = "云界抑菌剂优享活动";
|
|
|
//备注信息
|
|
|
payForWeiXin.remark = "无";
|
|
|
//商户logo的url
|
|
|
payForWeiXin.logo_imgurl = "";
|
|
|
//分享文案
|
|
|
payForWeiXin.share_content = "";
|
|
|
//分享链接
|
|
|
payForWeiXin.share_url = "";
|
|
|
//分享的图片url
|
|
|
payForWeiXin.share_imgurl = "";
|
|
|
//调用接口的机器 Ip 地址
|
|
|
payForWeiXin.client_ip = "121.41.56.160";
|
|
|
#endregion
|
|
|
|
|
|
#region 订单信息
|
|
|
//生成订单号组成: mch_id+yyyymmdd+10 位一天内不能重复的数字
|
|
|
//生成10位不重复的数字
|
|
|
string num = "0123456789";
|
|
|
string randomNum = RandomStr(num, 10);
|
|
|
payForWeiXin.mch_billno = payForWeiXin.mch_billno + System.DateTime.Now.ToString("yyyyMMdd") + randomNum;
|
|
|
#endregion
|
|
|
|
|
|
string postData = @"<xml>
|
|
|
<mch_billno>{0}</mch_billno>
|
|
|
<mch_id>{1}</mch_id>
|
|
|
<wxappid>{2}</wxappid>
|
|
|
<nick_name>{3}</nick_name>
|
|
|
<send_name>{4}</send_name>
|
|
|
<re_openid>{5}</re_openid>
|
|
|
<total_amount>{6}</total_amount>
|
|
|
<min_value>{7}</min_value>
|
|
|
<max_value>{8}</max_value>
|
|
|
<total_num>{9}</total_num>
|
|
|
<wishing>{10}</wishing>
|
|
|
<client_ip>{11}</client_ip>
|
|
|
<act_name>{12}</act_name>
|
|
|
<act_id>{13}</act_id>
|
|
|
<remark>{14}</remark>
|
|
|
<nonce_str>{15}</nonce_str>";
|
|
|
postData = string.Format(postData,
|
|
|
payForWeiXin.mch_billno,
|
|
|
payForWeiXin.mch_id,
|
|
|
payForWeiXin.wxappid,
|
|
|
payForWeiXin.nick_name,
|
|
|
payForWeiXin.send_name,
|
|
|
payForWeiXin.re_openid,
|
|
|
payForWeiXin.total_amount,
|
|
|
payForWeiXin.min_value,
|
|
|
payForWeiXin.max_value,
|
|
|
payForWeiXin.total_num,
|
|
|
payForWeiXin.wishing,
|
|
|
payForWeiXin.client_ip,
|
|
|
payForWeiXin.act_name,
|
|
|
payForWeiXin.act_id,
|
|
|
payForWeiXin.remark,
|
|
|
payForWeiXin.nonce_str
|
|
|
);
|
|
|
|
|
|
|
|
|
//原始传入参数
|
|
|
string[] signTemp = { "mch_billno=" + payForWeiXin.mch_billno, "mch_id=" + payForWeiXin.mch_id, "wxappid=" + payForWeiXin.wxappid, "nick_name=" + payForWeiXin.nick_name, "send_name=" + payForWeiXin.send_name, "re_openid=" + payForWeiXin.re_openid, "total_amount=" + payForWeiXin.total_amount, "min_value=" + payForWeiXin.min_value, "max_value=" + payForWeiXin.max_value, "total_num=" + payForWeiXin.total_num, "wishing=" + payForWeiXin.wishing, "client_ip=" + payForWeiXin.client_ip, "act_name=" + payForWeiXin.act_name, "act_id=" + payForWeiXin.act_id, "remark=" + payForWeiXin.remark, "nonce_str=" + payForWeiXin.nonce_str };
|
|
|
|
|
|
List<string> signList = signTemp.ToList();
|
|
|
|
|
|
//拼接原始字符串
|
|
|
if (!string.IsNullOrEmpty(payForWeiXin.logo_imgurl))
|
|
|
{
|
|
|
postData += "<logo_imgurl>{0}</logo_imgurl> ";
|
|
|
postData = string.Format(postData, payForWeiXin.logo_imgurl);
|
|
|
signList.Add("logo_imgurl=" + payForWeiXin.logo_imgurl);
|
|
|
}
|
|
|
if (!string.IsNullOrEmpty(payForWeiXin.share_content))
|
|
|
{
|
|
|
postData += "<share_content>{0}</share_content> ";
|
|
|
postData = string.Format(postData, payForWeiXin.share_content);
|
|
|
signList.Add("share_content=" + payForWeiXin.share_content);
|
|
|
}
|
|
|
if (!string.IsNullOrEmpty(payForWeiXin.share_url))
|
|
|
{
|
|
|
postData += "<share_url>{0}</share_url> ";
|
|
|
postData = string.Format(postData, payForWeiXin.share_url);
|
|
|
signList.Add("share_url=" + payForWeiXin.share_url);
|
|
|
}
|
|
|
if (!string.IsNullOrEmpty(payForWeiXin.share_imgurl))
|
|
|
{
|
|
|
postData += "<share_imgurl>{0}</share_imgurl> ";
|
|
|
postData = string.Format(postData, payForWeiXin.share_imgurl);
|
|
|
signList.Add("share_imgurl=" + payForWeiXin.share_imgurl);
|
|
|
}
|
|
|
|
|
|
#region 处理支付签名
|
|
|
//对signList按照ASCII码从小到大的顺序排序
|
|
|
signList.Sort();
|
|
|
|
|
|
string signOld = string.Empty;
|
|
|
string payForWeiXinOld = string.Empty;
|
|
|
int i = 0;
|
|
|
foreach (string temp in signList)
|
|
|
{
|
|
|
signOld += temp + "&";
|
|
|
i++;
|
|
|
}
|
|
|
signOld = signOld.Substring(0, signOld.Length - 1);
|
|
|
//拼接Key
|
|
|
signOld += "&key=" + key;
|
|
|
//处理支付签名
|
|
|
payForWeiXin.sign = Encrypt(signOld).ToUpper();
|
|
|
#endregion
|
|
|
postData += "<sign>{0}</sign></xml>";
|
|
|
postData = string.Format(postData, payForWeiXin.sign);
|
|
|
return postData;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 调用微信支付接口
|
|
|
/// </summary>
|
|
|
/// <param name="payForWeiXin"></param>
|
|
|
/// <returns></returns>
|
|
|
public string PayForWeiXin(string postData)
|
|
|
{
|
|
|
string result = string.Empty;
|
|
|
try
|
|
|
{
|
|
|
result = PostPage("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", postData);
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// post微信请求
|
|
|
/// </summary>
|
|
|
/// <param name="posturl"></param>
|
|
|
/// <param name="postData"></param>
|
|
|
/// <returns></returns>
|
|
|
public string PostPage(string posturl, string postData)
|
|
|
{
|
|
|
Stream outstream = null;
|
|
|
Stream instream = null;
|
|
|
StreamReader sr = null;
|
|
|
HttpWebResponse response = null;
|
|
|
HttpWebRequest request = null;
|
|
|
Encoding encoding = Encoding.UTF8;
|
|
|
byte[] data = encoding.GetBytes(postData);
|
|
|
// 准备请求...
|
|
|
try
|
|
|
{
|
|
|
//CerPath证书路径
|
|
|
string certPath = "D:\\mtkjerp\\Scripts\\cert\\apiclient_cert.p12";//"E:\\tfstmsk\\erp\\TradeManage\\TradeManage\\Scripts\\cert\\apiclient_cert.p12";
|
|
|
//证书密码
|
|
|
string password = "1245142102";
|
|
|
X509Certificate2 cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(certPath, password, X509KeyStorageFlags.MachineKeySet);
|
|
|
|
|
|
// 设置参数
|
|
|
request = WebRequest.Create(posturl) as HttpWebRequest;
|
|
|
CookieContainer cookieContainer = new CookieContainer();
|
|
|
request.CookieContainer = cookieContainer;
|
|
|
request.AllowAutoRedirect = true;
|
|
|
request.Method = "POST";
|
|
|
request.ContentType = "text/xml";
|
|
|
request.ContentLength = data.Length;
|
|
|
request.ClientCertificates.Add(cert);
|
|
|
outstream = request.GetRequestStream();
|
|
|
outstream.Write(data, 0, data.Length);
|
|
|
outstream.Close();
|
|
|
//发送请求并获取相应回应数据
|
|
|
response = request.GetResponse() as HttpWebResponse;
|
|
|
//直到request.GetResponse()程序才开始向目标网页发送Post请求
|
|
|
instream = response.GetResponseStream();
|
|
|
sr = new StreamReader(instream, encoding);
|
|
|
//返回结果网页(html)代码
|
|
|
string content = sr.ReadToEnd();
|
|
|
string err = string.Empty;
|
|
|
return content;
|
|
|
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
string err = ex.Message;
|
|
|
return string.Empty;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public string RandomStr(string str, int Length)
|
|
|
{
|
|
|
string result = string.Empty;
|
|
|
Random rd = new Random();
|
|
|
for (int i = 0; i < Length; i++)
|
|
|
{
|
|
|
result += str[rd.Next(str.Length)];
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// Md5加密
|
|
|
/// </summary>
|
|
|
/// <param name="s"></param>
|
|
|
/// <returns></returns>
|
|
|
public static String Encrypt(String s)
|
|
|
{
|
|
|
MD5 md5 = new MD5CryptoServiceProvider();
|
|
|
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s);
|
|
|
bytes = md5.ComputeHash(bytes);
|
|
|
md5.Clear();
|
|
|
string ret = "";
|
|
|
for (int i = 0; i < bytes.Length; i++)
|
|
|
{
|
|
|
ret += Convert.ToString(bytes[i], 16).PadLeft(2, '0');
|
|
|
}
|
|
|
return ret.PadLeft(32, '0');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
public class PayWeiXin
|
|
|
{
|
|
|
public string nonce_str { get; set; }
|
|
|
public string sign { get; set; }
|
|
|
public string mch_billno { get; set; }
|
|
|
public string mch_id { get; set; }
|
|
|
public string wxappid { get; set; }
|
|
|
public string nick_name { get; set; }
|
|
|
public string send_name { get; set; }
|
|
|
public string re_openid { get; set; }
|
|
|
public int total_amount { get; set; }
|
|
|
public int min_value { get; set; }
|
|
|
public int max_value { get; set; }
|
|
|
public int total_num { get; set; }
|
|
|
public string wishing { get; set; }
|
|
|
public string client_ip { get; set; }
|
|
|
public string act_id { get; set; }
|
|
|
public string act_name { get; set; }
|
|
|
public string remark { get; set; }
|
|
|
public string logo_imgurl { get; set; }
|
|
|
public string share_content { get; set; }
|
|
|
public string share_url { get; set; }
|
|
|
public string share_imgurl { get; set; }
|
|
|
|
|
|
}
|
|
|
} |