V3版JSAPI微信开发
前台代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="jsapi.aspx.cs" Inherits="_Default"
ResponseEncoding="GBK" Debug="true" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>公众号JSAPI支付测试网页</title>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<script language="javascript" src="http://res.mail.qq.com/mmr/static/lib/js/jquery.js"
type="text/javascript"></script>
<script language="javascript" src="http://res.mail.qq.com/mmr/static/lib/js/lazyloadv3.js"
type="text/javascript"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" />
<script language="javascript" type="text/javascript">
// 当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件。
// document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
$(function () {
//公众号支付
setTimeout('load()',3000);
});
// jQuery('a#getBrandWCPayRequest').click(function (e) {
function load() {
WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId": "<%= appId %>", //公众号名称,由商户传入
"timeStamp": "<%= timeStamp %>", //时间戳
"nonceStr": "<%= nonceStr %>", //随机串
"package": "<%= package %>", //扩展包
"signType": "MD5", //微信签名方式:1.sha1
"paySign": "<%= paySign %>" //微信签名
}, function (res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
alert("微信支付成功!");
} else if (res.err_msg == "get_brand_wcpay_request:cancel") {
alert("用户取消支付!");
} else {
alert(res.err_msg);
alert("支付失败!");
}
// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
//因此微信团队建议,当收到ok返回时,向商户后台询问是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此时未收到通知,商户后台主动调用查询订单接口,查询订单的当前状态,并反馈给前端展示相应的界面。
// });
});
}
</script>
</head>
<body>
<div class="WCPay">
<a id="getBrandWCPayRequest" href="javascript:void(0);">
<h1 class="title">
点击提交可体验微信支付</h1>
</a>
</div>
</body>
</html>
后台代码:
using System;
using System.IO;
using System.Text;
using System.Web.UI;
using System.Xml;
using Senparc.Weixin.MP.TenPayLibV3;
using Newtonsoft.Json;
//=================================
//JSAPI支付
//=================================
/// <summary>
/// 根据Code获取OpenID等信息
/// </summary>
public class ModelOpenID
{
public string access_token { get; set; }
public string expires_in { get; set; }
public string refresh_token { get; set; }
public string openid { get; set; }
public string scope { get; set; }
}
public partial class _Default : System.Web.UI.Page
{
public static string tenpay = "1"; //人民币
public static string partnerid = "1224288701"; //PartnerID
public static string partnerkey = "6d296b4a767de6d8dd83da4a80ff7958"; //PartnerKey
public static string mchid = "10033480"; //mchid
public static string appId = "wx1ab11d0813cd3c4c"; //appid
public static string appsecret = "592363ee602b28133316b2020d8c3545"; //appsecret
public static string appkey = "beijingzhongchengkexin2014120610"; //paysignkey(非appkey 在微信商户平台设置 (md5)111111111111)
public static string timeStamp = ""; //时间戳
public static string nonceStr = ""; //随机字符串
public static string notify_url = "http://test.zckx.net/wx/payNotifyUrl.aspx"; //支付完成后的回调处理页面,*替换成notify_url.asp所在路径
public static string code = ""; //微信端传来的code
public static string prepayId = ""; //预支付ID
public static string sign = ""; //为了获取预支付ID的签名
public static string paySign = ""; //进行支付需要的签名
public static string package = ""; //进行支付需要的包
protected void Page_Load(object sender, EventArgs e)
{
try
{
if (Request.QueryString["code"] != null)
{
code = Request.QueryString["code"];
WriteFile(Server.MapPath("") + "\\Log.txt", code);
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 returnStr = HttpUtil.Send("", url);
var obj = JsonConvert.DeserializeObject<ModelOpenID>(returnStr);
url = string.Format(
"https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1}",
appId, obj.refresh_token);
returnStr = HttpUtil.Send("", url);
obj = JsonConvert.DeserializeObject<ModelOpenID>(returnStr);
WriteFile(Server.MapPath("") + "\\Log.txt", obj.access_token);
WriteFile(Server.MapPath("") + "\\Log.txt", obj.openid);
url = string.Format(
"https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}",
obj.access_token, obj.openid);
returnStr = HttpUtil.Send("", url);
WriteFile(Server.MapPath("") + "\\Log.txt", returnStr);
///////////////////////////////////////////////////////////////////////////////////////////////
string sp_billno = Request["order_no"];
//当前时间 yyyyMMdd
string date = DateTime.Now.ToString("yyyyMMdd");
if (null == sp_billno)
{
//生成订单10位序列号,此处用时间和随机数生成,商户根据自己调整,保证唯一
sp_billno = DateTime.Now.ToString("HHmmss") + TenPayUtil.BuildRandomStr(4);
}
else
{
sp_billno = Request["order_no"];
}
sp_billno = partnerid + sp_billno;
//创建支付应答对象
var packageReqHandler = new RequestHandler(Context);
//初始化
packageReqHandler.Init();
timeStamp = TenPayUtil.GetTimestamp();
nonceStr = TenPayUtil.GetNoncestr();
string tPriceAll = (int.Parse(Request["tPriceAll"].ToString()) * 100).ToString();
//设置package订单参数
packageReqHandler.SetParameter("body", "在线购票"); //商品信息 127字符
packageReqHandler.SetParameter("appid", appId);
packageReqHandler.SetParameter("mch_id", mchid);
packageReqHandler.SetParameter("nonce_str", nonceStr.ToLower());
packageReqHandler.SetParameter("notify_url", notify_url);
packageReqHandler.SetParameter("openid", obj.openid); //"oHkbRt8LUh-kKiR-hILuAmL-4Suk"
packageReqHandler.SetParameter("out_trade_no", sp_billno); //商家订单号
packageReqHandler.SetParameter("spbill_create_ip", Page.Request.UserHostAddress); //用户的公网ip,不是商户服务器IP
packageReqHandler.SetParameter("total_fee", tPriceAll); //商品金额,以分为单位(money * 100).ToString()
packageReqHandler.SetParameter("trade_type", "JSAPI");
//获取package包
sign = packageReqHandler.CreateMd5Sign("key", appkey);
WriteFile(Server.MapPath("") + "\\Log.txt", sign);
packageReqHandler.SetParameter("sign", sign);
string data = packageReqHandler.ParseXML();
WriteFile(Server.MapPath("") + "\\Log.txt", data);
string prepayXml = HttpUtil.Send(data, "https://api.mch.weixin.qq.com/pay/unifiedorder");
WriteFile(Server.MapPath("") + "\\Log.txt", prepayXml);
//获取预支付ID
var xdoc = new XmlDocument();
xdoc.LoadXml(prepayXml);
XmlNode xn = xdoc.SelectSingleNode("xml");
XmlNodeList xnl = xn.ChildNodes;
if (xnl.Count > 7)
{
prepayId = xnl[7].InnerText;
package = string.Format("prepay_id={0}", prepayId);
WriteFile(Server.MapPath("") + "\\Log.txt", package);
}
//设置支付参数
var paySignReqHandler = new RequestHandler(Context);
paySignReqHandler.SetParameter("appId", appId);
paySignReqHandler.SetParameter("timeStamp", timeStamp);
paySignReqHandler.SetParameter("nonceStr", nonceStr);
paySignReqHandler.SetParameter("package", package);
paySignReqHandler.SetParameter("signType", "MD5");
paySign = paySignReqHandler.CreateMd5Sign("key", appkey);
WriteFile(Server.MapPath("") + "\\Log.txt", paySign);
}
}
catch (Exception ex)
{
WriteFile(Server.MapPath("") + "\\Log.txt", ex.Message);
throw;
}
}
public static void WriteFile(string pathWrite, string content)
{
if (File.Exists(pathWrite))
{
//File.Delete(pathWrite);
}
File.AppendAllText(pathWrite, content + "\r\n----------------------------------------\r\n",
Encoding.GetEncoding("utf-8"));
}
}

浙公网安备 33010602011771号