using System;using System.Collections.Generic;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Runtime.Serialization;using System.IO;using System.Text;using System.Net;using System.Web.Security;using LitJson;
namespace
WxPayAPI
{
public
class
JsApiPayMvc
{
public
HttpContextBase context { get; set; }
public
string openid { get; set; }
public
string access_token { get; set; }
public
int total_fee { get; set; }
public
WxPayData unifiedOrderResult { get; set; }
public
JsApiPayMvc(HttpContextBase _context)
{
context = _context;
}
public
void GetOpenidAndAccessToken(string code)
{
if
(!string.IsNullOrEmpty(code))
{
Log.Debug(this.
GetType
().ToString(),
"Get code : "
+ code);
GetOpenidAndAccessTokenFromCode(code);
}
else
{
string host = context.Request.Url.Host; string path = context.Request.Path; string redirect_uri = HttpUtility.UrlEncode(
"http://"
+ host + path);
WxPayData data =
new
WxPayData();
data.SetValue(
"appid"
, WxPayConfig.APPID);
data.SetValue(
"redirect_uri"
, redirect_uri);
data.SetValue(
"response_type"
,
"code"
);
data.SetValue(
"scope"
,
"snsapi_base"
);
data.SetValue(
"state"
,
"STATE"
+
"#wechat_redirect"
); string url =
"https://open.weixin.qq.com/connect/oauth2/authorize?"
+ data.ToUrl();
Log.Debug(this.
GetType
().ToString(),
"Will Redirect to URL : "
+ url);
try
{
context.Response.Redirect(url);
{
}
}
}
public
void GetOpenidAndAccessTokenFromCode(string code)
{
try
{
WxPayData data =
new
WxPayData();
data.SetValue(
"appid"
, WxPayConfig.APPID);
data.SetValue(
"secret"
, WxPayConfig.APPSECRET);
data.SetValue(
"code"
, code);
data.SetValue(
"grant_type"
,
"authorization_code"
); string url =
"https://api.weixin.qq.com/sns/oauth2/access_token?"
+ data.ToUrl(); //请求url以获取数据
string result = HttpService.Get(url);
Log.Debug(this.
GetType
().ToString(),
"GetOpenidAndAccessTokenFromCode response : "
+ result);
JsonData jd = JsonMapper.ToObject(result);
access_token = (string)jd[
"access_token"
];
openid = (string)jd[
"openid"
];
Log.Debug(this.
GetType
().ToString(),
"Get openid : "
+ openid);
Log.Debug(this.
GetType
().ToString(),
"Get access_token : "
+ access_token);
}
catch
(Exception ex)
{
Log.Error(this.
GetType
().ToString(), ex.ToString());
throw
new
WxPayException(ex.ToString());
}
}
public
WxPayData GetUnifiedOrderResult()
{
WxPayData data =
new
WxPayData();
data.SetValue(
"body"
,
"test"
);
data.SetValue(
"attach"
,
"test"
);
data.SetValue(
"out_trade_no"
, WxPayApi.GenerateOutTradeNo());
data.SetValue(
"total_fee"
, total_fee);
data.SetValue(
"time_start"
, DateTime.Now.ToString(
"yyyyMMddHHmmss"
));
data.SetValue(
"time_expire"
, DateTime.Now.AddMinutes(10).ToString(
"yyyyMMddHHmmss"
));
data.SetValue(
"goods_tag"
,
"test"
);
data.SetValue(
"trade_type"
,
"JSAPI"
);
data.SetValue(
"openid"
, openid);
WxPayData result = WxPayApi.UnifiedOrder(data);
if
(!result.IsSet(
"appid"
) || !result.IsSet(
"prepay_id"
) || result.GetValue(
"prepay_id"
).ToString() ==
""
)
{
Log.Error(this.
GetType
().ToString(),
"UnifiedOrder response error!"
);
throw
new
WxPayException(
"UnifiedOrder response error!"
);
}
unifiedOrderResult = result;
return
result;
}
public
string GetJsApiParameters()
{
Log.Debug(this.
GetType
().ToString(),
"JsApiPay::GetJsApiParam is processing..."
);
WxPayData jsApiParam =
new
WxPayData();
jsApiParam.SetValue(
"appId"
, unifiedOrderResult.GetValue(
"appid"
));
jsApiParam.SetValue(
"timeStamp"
, WxPayApi.GenerateTimeStamp());
jsApiParam.SetValue(
"nonceStr"
, WxPayApi.GenerateNonceStr());
jsApiParam.SetValue(
"package"
,
"prepay_id="
+ unifiedOrderResult.GetValue(
"prepay_id"
));
jsApiParam.SetValue(
"signType"
,
"MD5"
);
jsApiParam.SetValue(
"paySign"
, jsApiParam.MakeSign()); string parameters = jsApiParam.ToJson();
Log.Debug(this.
GetType
().ToString(),
"Get jsApiParam : "
+ parameters);
return
parameters;
}
public
string GetEditAddressParameters()
{ string parameter =
""
;
try
{ string host = context.Request.Url.Host; string path = context.Request.Path; string queryString = context.Request.Url.Query;
string url =
"http://"
+ host + path + queryString; //构造需要用SHA1算法加密的数据
WxPayData signData =
new
WxPayData();
signData.SetValue(
"appid"
,WxPayConfig.APPID);
signData.SetValue(
"url"
, url);
signData.SetValue(
"timestamp"
,WxPayApi.GenerateTimeStamp());
signData.SetValue(
"noncestr"
,WxPayApi.GenerateNonceStr());
signData.SetValue(
"accesstoken"
,access_token); string param = signData.ToUrl();
Log.Debug(this.
GetType
().ToString(),
"SHA1 encrypt param : "
+ param);
string addrSign = FormsAuthentication.HashPasswordForStoringInConfigFile(param,
"SHA1"
);
Log.Debug(this.
GetType
().ToString(),
"SHA1 encrypt result : "
+ addrSign);
WxPayData afterData =
new
WxPayData();
afterData.SetValue(
"appId"
,WxPayConfig.APPID);
afterData.SetValue(
"scope"
,
"jsapi_address"
);
afterData.SetValue(
"signType"
,
"sha1"
);
afterData.SetValue(
"addrSign"
,addrSign);
afterData.SetValue(
"timeStamp"
,signData.GetValue(
"timestamp"
));
afterData.SetValue(
"nonceStr"
,signData.GetValue(
"noncestr"
));
parameter = afterData.ToJson();
Log.Debug(this.
GetType
().ToString(),
"Get EditAddressParam : "
+ parameter);
}
catch
(Exception ex)
{
Log.Error(this.
GetType
().ToString(), ex.ToString());
throw
new
WxPayException(ex.ToString());
}
return
parameter;
}
}
}
暂时没有评论,来抢沙发吧~