发布:2021/11/15 10:28:03作者:管理员 来源:本站 浏览次数:769
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="play.aspx.cs" Inherits="qrcode_play" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>微信公众号支付</title>
<script type="text/javascript">
//调用微信JS api 支付
function jsApiCall(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
<%=wxJsApiParam%>, //josn串
function (res){
WeixinJSBridge.log(res.err_msg);
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
window.location.href="<%=returnUrl%>"; //成功后跳转到提示页面
}
}
);
}
function callpay(){
if (typeof WeixinJSBridge == "undefined"){
if (document.addEventListener){
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}else{
jsApiCall();
}
}
//页面加载完成后执行函数
window.onload = callpay;
</script>
</head>
<body>
<p><%=_response %></p>
<p><%=wxJsApiParam %></p>
</body>
</html>
using ejk5;
using Maticsoft.Fn;
using OnlineAPI.App_Start;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.UI;
using System.Web.UI.WebControls;
using log4net;
public partial class qrcode_play : BasePage
{
private string m = string.Empty;
private string t = string.Empty;
private string s = string.Empty;
protected string wxJsApiParam = string.Empty;
protected string returnUrl = "";
protected string _response= string.Empty;
protected Maticsoft.Model.SEO_ServiceOrder _ServiceOrder = new Maticsoft.Model.SEO_ServiceOrder();
ILog _log = LogManager.GetLogger("qrcode_play");
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request["code"]))
{
//根据appid,secret,code取到用户的全部信息
Dictionary<string, object> dic = GetUserInfoByCode(WxPayConfig.GetConfig().GetAppID(), WxPayConfig.GetConfig().GetAppSecret(), Request["code"].ToString());
if (dic.ContainsKey("errcode"))
{
//return Redirect("/WError/Index?Msg=" + dic["errmsg"].ToString());
Response.Write(dic["errmsg"].ToString());
Response.End();
}
string openid = dic["openid"].ToString();
//JSAPI支付预处理
try
{
_ServiceOrder = _bll_SEO_ServiceOrder.GetModelList(string.Format("SsOrderid='{0}'", Request["state"])).FirstOrDefault();
if (_ServiceOrder == null)
{
Response.Redirect("/404.html");
Response.End();
}
var total_fee = Convert.ToDouble(_ServiceOrder.PaidTotalPrice) * 100;
//统一下单
string sendUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
JsApiConfig jsApiConfig = new JsApiConfig(0);
WxPayData data = new WxPayData();
data.SetValue("body", _ServiceOrder.Title); //商品描述
data.SetValue("detail", _ServiceOrder.Title); //商品详情
data.SetValue("out_trade_no", _ServiceOrder.SsOrderid); //商户订单号
data.SetValue("total_fee", total_fee.ToString()); //订单总金额,以分为单位
data.SetValue("trade_type", "JSAPI"); //交易类型
data.SetValue("openid", openid); //公众账号ID
data.SetValue("appid", WxPayConfig.GetConfig().GetAppID()); //公众账号ID
data.SetValue("mch_id", WxPayConfig.GetConfig().GetMchID()); //商户号
data.SetValue("nonce_str", JsApiPay.GenerateNonceStr()); //随机字符串
data.SetValue("notify_url", "http://www.zybw.com/Handler/Notify_url.aspx"); //异步通知url
data.SetValue("spbill_create_ip", GetIP()); //终端IP
data.SetValue("sign", data.MakeSign(WxPayData.SIGN_TYPE_MD5)); //签名
string xml = data.ToXml(); //转换成XML
var startTime = DateTime.Now; //开始时间
string response = HttpService.Post(xml, sendUrl, false, 6); //发送请求
_log.Debug(response);
_response = response;
var endTime = DateTime.Now; //结束时间
int timeCost = (int)((endTime - startTime).TotalMilliseconds); //计算所用时间
WxPayData result = new WxPayData();
result.FromXml(response, WxPayData.SIGN_TYPE_MD5);
//JsApiPay.ReportCostTime(0, sendUrl, timeCost, result); //测速上报
//获取H5调起JS API参数
WxPayData jsApiParam = new WxPayData();
jsApiParam.SetValue("appId", result.GetValue("appid"));
jsApiParam.SetValue("timeStamp", JsApiPay.GenerateTimeStamp());
jsApiParam.SetValue("nonceStr", JsApiPay.GenerateNonceStr());
jsApiParam.SetValue("package", "prepay_id=" + result.GetValue("prepay_id"));
jsApiParam.SetValue("signType", "MD5");
jsApiParam.SetValue("paySign", jsApiParam.MakeSign(WxPayData.SIGN_TYPE_MD5));
wxJsApiParam = jsApiParam.ToJson();
//支付成功后跳转的URL
returnUrl = "https://www.zybw.com/qrcode/sucess.aspx?orderid=" + _ServiceOrder.SsOrderid;
}
catch (Exception ex)
{
Response.Write("非法操作"+ex.Message);
Response.End();
return;
}
}
else
{
m = Request.QueryString["orderid"];
t = Request.QueryString["t"];
s = Request.QueryString["s"];
/*
var key = Utils.EncryptAdmin(m + t);
if (!key.Equals(s))
{
Response.Write("非法操作");
Response.End();
}
*/
string redirect_uri = HttpUtility.UrlEncode("http://" + Request.Url.Authority + Request.Url.PathAndQuery);
//return Redirect(string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=STATE#wechat_redirect", AppId, redirect_uri, "snsapi_userinfo"));
var url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state={3}#wechat_redirect", WxPayConfig.GetConfig().GetAppID(), redirect_uri, "snsapi_userinfo", m);
Response.Redirect(url);
}
}
//因H5支付要求商户在统一下单接口中上传用户真实ip地址“spbill_create_ip”,故需要调用以下方法。
public string GetIP()
{
HttpRequest request = HttpContext.Current.Request;
string result = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(result))
{
result = request.ServerVariables["REMOTE_ADDR"];
}
if (string.IsNullOrEmpty(result))
{
result = request.UserHostAddress;
}
if (string.IsNullOrEmpty(result))
{
result = "0.0.0.0";
}
return result;
}
/// <summary>
/// 获得Code
/// </summary>
/// <typeparam name="T">表</typeparam>
/// <returns></returns>
protected long GetCode<T>()
{
Type type = typeof(T);
return 0000;
//return BLL.TSYS_Code.Instence.GetCode(type.Name);
}
/// <summary>
///用code换取获取用户信息(包括非关注用户的)(此access_token是网页授权的和普通无关)
/// </summary>
/// <param name="Appid"></param>
/// <param name="Appsecret"></param>
/// <param name="Code">回调页面带的code参数</param>
/// <returns>获取用户信息(json格式)</returns>
public Dictionary<string, object> GetUserInfoByCode(string Appid, string Appsecret, string Code)
{
JavaScriptSerializer Jss = new JavaScriptSerializer();
string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", Appid, Appsecret, Code);
string ReText = WebRequestPostOrGet(url, "");//post/get方法获取信息
Dictionary<string, object> DicText = (Dictionary<string, object>)Jss.DeserializeObject(ReText);
if (!DicText.ContainsKey("openid"))
{
return DicText;
}
else
{
Dictionary<string, object> respDic = (Dictionary<string, object>)Jss.DeserializeObject(WebRequestPostOrGet("https://api.weixin.qq.com/sns/userinfo?access_token=" + DicText["access_token"] + "&openid=" + DicText["openid"] + "&lang=zh_CN", ""));
return respDic;
}
}
#region Post/Get提交调用抓取
/// <summary>
/// Post/get 提交调用抓取
/// </summary>
/// <param name="url">提交地址</param>
/// <param name="param">参数</param>
/// <returns>string</returns>
public static string WebRequestPostOrGet(string sUrl, string sParam)
{
byte[] bt = System.Text.Encoding.UTF8.GetBytes(sParam);
Uri uriurl = new Uri(sUrl);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uriurl);//HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url + (url.IndexOf("?") > -1 ? "" : "?") + param);
req.Method = "Post";
req.Timeout = 120 * 1000;
req.ContentType = "application/x-www-form-urlencoded;";
req.ContentLength = bt.Length;
using (Stream reqStream = req.GetRequestStream())//using 使用可以释放using段内的内存
{
reqStream.Write(bt, 0, bt.Length);
reqStream.Flush();
}
try
{
using (WebResponse res = req.GetResponse())
{
//在这里对接收到的页面内容进行处理
Stream resStream = res.GetResponseStream();
StreamReader resStreamReader = new StreamReader(resStream, System.Text.Encoding.UTF8);
string resLine;
System.Text.StringBuilder resStringBuilder = new System.Text.StringBuilder();
while ((resLine = resStreamReader.ReadLine()) != null)
{
resStringBuilder.Append(resLine + System.Environment.NewLine);
}
resStream.Close();
resStreamReader.Close();
return resStringBuilder.ToString();
}
}
catch (Exception ex)
{
return ex.Message;//url错误时候回报错
}
}
#endregion Post/Get提交调用抓取
}