翼通微信API支付方法,代码如下:
代码一:取得code
<%@ WebHandler Language="C#" Class="DTcms.Web.dev.wxpaydemo1" %>
//上面这个wxnetpaysend 可以自定义
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.SessionState;
using System.IO;
using System.Text;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using DTcms.Common;
using DTcms.DBUtility;
using NetWing.Common.Data.SQLServer;
using NetWing.Common.Request;
using DTcms.API.Payment.wxpay;//必须引入微信支付类
using Senparc.Weixin.MP.TenPayLibV3;//必须引入微信支付类用于生产不重复订单号
namespace DTcms.Web.dev
{
/// <summary>
/// 用户绑定类
/// </summary>
//wxnetpaysend 这个类可以自定义 必须和上面保持一致
public class wxpaydemo1 : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text / plain";
//调用【网页授权获取用户信息】接口获取用户的openid和access_token
//获取用户的OPENID回调地址
string redirect_url = "http://" + HttpContext.Current.Request.Url.Authority.ToLower() + "/dev/wxpaydemo2.ashx";
JsApiConfig jsApiConfig = new JsApiConfig();
WxPayData data = new WxPayData();
data.SetValue("appid", jsApiConfig.AppId);
data.SetValue("redirect_uri", HttpUtility.UrlEncode(redirect_url));
data.SetValue("response_type", "code");
data.SetValue("scope", "snsapi_base");
data.SetValue("state", "yes#wechat_redirect"); //state这个不是必须
string url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl();
try
{
//触发微信返回code码
//Response.Redirect(url);//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常
context.Response.Redirect(url);
}
catch (System.Threading.ThreadAbortException ex)
{
//context.Response.Write(ex);
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
代码二:取得openid
<%@ WebHandler Language="C#" Class="DTcms.Web.dev.wxpaydemo2" %>
//上面这个wxnetpaysend 可以自定义
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.SessionState;
using System.IO;
using System.Text;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using DTcms.Common;
using DTcms.DBUtility;
using NetWing.Common.Data.SQLServer;
using NetWing.Common.Request;
using DTcms.API.Payment.wxpay;//必须引入微信支付类
using Senparc.Weixin.MP.TenPayLibV3;//必须引入微信支付类用于生产不重复订单号
namespace DTcms.Web.dev
{
/// <summary>
/// 用户绑定类
/// </summary>
//wxnetpaysend 这个类可以自定义 必须和上面保持一致
public class wxpaydemo2 : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text / plain";
//这步只是取得code 和传过来的state 这里没有用到state这个参数,state可以传单号、用户id等
string code = context.Request.QueryString["code"];
//获取openid及access_token的url
try
{
JsApiConfig jsApiConfig = new JsApiConfig();
WxPayData data = new WxPayData();
data.SetValue("appid", jsApiConfig.AppId);
data.SetValue("secret", jsApiConfig.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);
//获取用户openid
Dictionary<string, object> dic = JsonHelper.DataRowFromJSON(result);
string openid = (string)dic["openid"];
//跳转转值到处理页面 后面多加了个false 详细见下面
context.Response.Redirect("wxpaydemo3.ashx?openid=" + openid, false);
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
代码三:生成jsapi支付
<%@ WebHandler Language="C#" Class="DTcms.Web.dev.wxpaydemo3" %>
//上面这个wxnetpaysend 可以自定义
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.SessionState;
using System.IO;
using System.Text;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using DTcms.Common;
using DTcms.DBUtility;
using NetWing.Common.Data.SQLServer;
using NetWing.Common.Request;
using DTcms.API.Payment.wxpay;//必须引入微信支付类
using Senparc.Weixin.MP.TenPayLibV3;//必须引入微信支付类用于生产不重复订单号
namespace DTcms.Web.dev
{
/// <summary>
/// 用户绑定类
/// </summary>
//wxnetpaysend 这个类可以自定义 必须和上面保持一致
public class wxpaydemo3 : IHttpHandler, IRequiresSessionState
{
public static string wxJsApiParam = "";
public static string returnUrl = "http://lab.yn137.com/";//支付成功后跳转url
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
//生成不重复订单号
string sp_billno = DateTime.Now.ToString("HHmmss") + TenPayV3Util.BuildRandomStr(28);
string openid = DTRequest.GetQueryString("openid");
try
{
//统一下单
string sendUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
//支付成功或失败通知文件
string notify_url = "http://" + HttpContext.Current.Request.Url.Authority.ToLower() + "/dev/wxpaydemoreceive.ashx";
JsApiConfig jsApiConfig = new JsApiConfig();
WxPayData data = new WxPayData();
data.SetValue("body", "测试商品"); //商品描述
data.SetValue("detail", "测试商品详情"); //商品详情
data.SetValue("out_trade_no", sp_billno); //商户订单号
data.SetValue("total_fee", (Convert.ToDouble(0.1) * 100).ToString()); //订单总金额,以分为单位
data.SetValue("trade_type", "JSAPI"); //交易类型
data.SetValue("openid", openid); //公众账号ID
data.SetValue("appid", jsApiConfig.AppId); //公众账号ID
data.SetValue("mch_id", jsApiConfig.Partner); //商户号
data.SetValue("nonce_str", JsApiPay.GenerateNonceStr()); //随机字符串
data.SetValue("notify_url", notify_url); //异步通知url
data.SetValue("spbill_create_ip", DTRequest.GetIP()); //终端IP
data.SetValue("sign", data.MakeSign(jsApiConfig.Key)); //签名
string xml = data.ToXml(); //转换成XML
var startTime = DateTime.Now; //开始时间
string response = HttpService.Post(xml, sendUrl, false, 6); //发送请求
var endTime = DateTime.Now; //结束时间
int timeCost = (int)((endTime - startTime).TotalMilliseconds); //计算所用时间
WxPayData result = new WxPayData();
result.FromXml(response, jsApiConfig.Key);
JsApiPay.ReportCostTime(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(jsApiConfig.Key));
wxJsApiParam = jsApiParam.ToJson();
}
catch (Exception ex)
{
context.Response.Write("调用JSAPI下单失败,请检查微信授权目录是否已注册!");
return;
}
StringBuilder sb = new StringBuilder();
sb.Append("<!DOCTYPE html> \r\n");
sb.Append("<html xmlns=\"http://www.w3.org/1999/xhtml\"> \r\n");
sb.Append("<head> \r\n");
sb.Append("<meta http-equiv=\"content-type\" content=\"text/html; charset =utf-8\"/> \r\n");
sb.Append("<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"/> \r\n");
sb.Append("<title>微信公众号支付</title> \r\n");
sb.Append("<script type=\"text/javascript\"> \r\n");
//sb.Append(" alert(); \r\n");
sb.Append(" //调用微信JS api 支付 \r\n");
sb.Append(" function jsApiCall(){ \r\n");
sb.Append(" WeixinJSBridge.invoke( \r\n");
sb.Append(" 'getBrandWCPayRequest', \r\n");
sb.Append(" " + wxJsApiParam + ", //josn串 \r\n");
sb.Append(" function (res){ \r\n");
sb.Append(" WeixinJSBridge.log(res.err_msg); \r\n");
sb.Append(" if(res.err_msg =='get_brand_wcpay_request:ok') { \r\n");
sb.Append(" window.location.href='" + returnUrl + "'; //成功后跳转到提示页面 \r\n");
sb.Append(" } \r\n");
sb.Append(" } \r\n");
sb.Append(" ); \r\n");
sb.Append(" } \r\n");
sb.Append(" function callpay(){ \r\n");
sb.Append(" if (typeof WeixinJSBridge =='undefined'){ \r\n");
sb.Append(" if (document.addEventListener){ \r\n");
sb.Append(" document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); \r\n");
sb.Append(" }else if (document.attachEvent){ \r\n");
sb.Append(" document.attachEvent('WeixinJSBridgeReady', jsApiCall); \r\n");
sb.Append(" document.attachEvent('onWeixinJSBridgeReady', jsApiCall); \r\n");
sb.Append(" } \r\n");
sb.Append(" }else{ \r\n");
sb.Append(" jsApiCall(); \r\n");
sb.Append(" } \r\n");
sb.Append(" } \r\n");
sb.Append(" //页面加载完成后执行函数 \r\n");
sb.Append(" window.onload = callpay; \r\n");
sb.Append("</script> \r\n");
sb.Append("</head> \r\n");
sb.Append("<body> \r\n");
sb.Append("</body> \r\n");
sb.Append("</html> \r\n");
sb.Append(" ");
context.Response.Write(sb.ToString());
sb.Clear();
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
代码四:通知页面 写入日志
<%@ WebHandler Language="C#" Class="DTcms.Web.dev.wxpaydemoreceive" %>
//上面这个wxnetpaysend 可以自定义
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.SessionState;
using System.IO;
using System.Text;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using DTcms.Common;
using DTcms.DBUtility;
using NetWing.Common.Data.SQLServer;
using NetWing.Common.Request;
using DTcms.API.Payment.wxpay;//必须引入微信支付类
using Senparc.Weixin.MP.TenPayLibV3;//必须引入微信支付类用于生产不重复订单号
namespace DTcms.Web.dev
{
/// <summary>
/// 用户绑定类
/// </summary>
//wxpaydemoreceive 这个类可以自定义 必须和上面保持一致
public class wxpaydemoreceive : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text / plain";
WxPayData notifyData = JsApiPay.GetNotifyData();
string transaction_id = notifyData.GetValue("transaction_id").ToString(); //微信支付订单号
string order_no = notifyData.GetValue("out_trade_no").ToString(); //商户订单号
string total_fee = notifyData.GetValue("total_fee").ToString(); //获取总金额
if (!string.IsNullOrEmpty(total_fee))
{
string path = context.Server.MapPath("log.txt");//文件存放路径,保证文件存在。
StreamWriter sw = new StreamWriter(path, true);
sw.WriteLine("成功|"+DateTime.Now.ToString()+"|"+transaction_id+"|"+order_no+"|"+total_fee);
sw.Close();
}
else
{
string path = context.Server.MapPath("log.txt");//文件存放路径,保证文件存在。
StreamWriter sw = new StreamWriter(path, true);
sw.WriteLine("失败|"+DateTime.Now.ToString()+"|"+transaction_id+"|"+order_no+"|"+total_fee);
sw.Close();
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
Copyright © 2004-2024 Ynicp.com 版权所有 法律顾问:建纬(昆明)律师事务所 昆明市网翼通科技有限公司 滇ICP备08002592号-4