公众号支付具体流程和安装都不说了,大家都可以去看文档,具体代码实现,页面因为是例子就一个按钮
微信回调也是这个页面
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>微信支付</title>
</head>
<body>
<div class="line">
<input type="button" class="btn" value="立即充值" onclick="fCharge()" style="margin-top: 20px;" />
</div>
<script src="~/Scripts/jquery-1.7.1.intellisense.js"></script>
<script src="~/Scripts/jquery-1.7.1.js"></script>
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
$(function () {
var vCode = getQueryString("code");
if (vCode != "" && vCode != null) {
//alert(vCode);
$.ajax({
type: 'post',
data: {
code: vCode
},
url: '/WeiChat/getWxInfo',
success: function (sjson) {
alert(sjson);
var vData = JSON.stringify(sjson);
alert(vData);
}
})
}
else {
$.ajax({
type: 'post',
url: '/WeiChat/getCode',
success: function (sjson) {
//alert(sjson);
location.href = sjson;
}
})
}
})
//获取url的参数
function getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]); return null;
}
//初始化微信支付环境
function fCharge() {
if (typeof WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
} else if (document.attachEvent) {
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
} else {
fPostCharge();
}
}
//提交充值数据
function fPostCharge() {
$.ajax({
type: "post",
data: "totalfee=1",
url: "/WeiChat/WeChat_Wap",
success: function (json) {
console.log(json);
var jsnStr = JSON.parse(json);
onBridgeReady(jsnStr);
},
error: function () {
alert("提示", '调用微信支付模块失败,请稍后再试。', 'info')
}
})
}
//调用微信支付模块
function onBridgeReady(json) {
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId": json.appId, //公众号名称,由商户传入
"timeStamp": json.timeStamp, //时间戳,自1970年以来的秒数
"nonceStr": json.nonceStr, //随机串
"package": json.package,
"signType": "MD5", //微信签名方式:
"paySign": json.paySign //微信签名
},
function (res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
alert("支付成功,请稍后查询余额,如有疑问,请联系管理员.");
fAlreadyPay();
} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。
}
);
}
</script>
</body>
</html>
控制器
using LitJson;
using Smile.Framework.Tools;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using WxPayAPI.lib;
namespace WxPayAPI.Controllers
{
public class WeiChatController : Controller
{
JsApiPay jsApiPay = new JsApiPay();
#region 视图页面
/// <summary>
/// 微信支付页面
/// </summary>
/// <returns></returns>
public ActionResult WeChat()
{
if (Session["openid"] == null)
{
try
{
GetOpenidAndAccessToken();
}
catch (Exception ex)
{
}
}
return View();
}
#endregion
#region 20170330 gaosheng 微信支付
/**
//* 网页授权获取用户基本信息的全部过程
//* 详情请参看网页授权获取用户基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
//* 第一步:利用url跳转获取code
//* 第二步:利用code去获取openid和access_token
//*/
public void GetOpenidAndAccessToken()
{
if (Session["code"] != null)
{
//获取code码,以获取openid和access_token
string code = Session["code"].ToString();
Log.Debug(this.GetType().ToString(), "Get code : " + code);
jsApiPay.GetOpenidAndAccessTokenFromCode(code);
}
else
{
//构造网页授权获取code的URL
string host = Request.Url.Host;
string path = Request.Path;
string redirect_uri = HttpUtility.UrlEncode(WxPayConfig.NOTIFY_URL);
//string redirect_uri = HttpUtility.UrlEncode("http://gzh.lmx.ren");
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);
Session["url"] = url;
}
}
/// <summary>
/// 获取code
/// </summary>
/// <returns></returns>
[HttpPost]
public ActionResult getCode()
{
object objResult = "";
if (Session["url"] != null)
{
objResult = Session["url"].ToString();
}
else
{
objResult = "url为空。";
}
return Json(objResult);
}
/// <summary>
/// 通过code换取网页授权access_token和openid的返回数据
/// </summary>
/// <returns></returns>
[HttpPost]
public ActionResult getWxInfo()
{
object objResult = "";
string strCode = Request.Form["code"];
JsonData jd = null;
if (Session["access_token"] == null || Session["openid"] == null)
{
jd= jsApiPay.GetOpenidAndAccessTokenFromCode(strCode);
Session["access_token"] = jd["access_token"];
Session["openid"] = jd["openid"];
}
string strAccess_Token = Session["access_token"].ToString();
string strOpenid = Session["openid"].ToString();
objResult = new { openid = strOpenid, access_token = strAccess_Token };
return Json(objResult);
}
/// <summary>
/// 点击支付进入,对微信端进行下单
/// </summary>
/// <param name="id"></param>
/// <param name="return_url"></param>
/// <returns></returns>
public ActionResult WeChat_Wap()
{
try
{
//T_Order order = null;
//var orderid = Base64Help.base64ToString(id);
//var OrderBll = new T_OrderManager();
//var exist = OrderBll.ExistOrder(orderid, out order);
//if (!exist)
//{
// throw new Exception("缺少需要验证支付状态的必要条件");
//}
//if (order.OrderType != (int)OrderTypeEnum.Create)
//{
// throw new Exception("订单支付类型错误");
//}
//if (order.OrderState == (int)OrderStateEnum.Successful)
//{
// return Json("订单已支付,请勿重复提交");
//}
//生成订单号
//OrderBll.UpdateOrderNumber(orderid, out order);
//调用手机网站支付接口
//SetAliPay_Wap(order.OrderNumber, return_url);
var model = SetWeChat_Wap().ToJson().Replace("\\", "");
return Json(model);
}
catch (Exception ex)
{
return Json("");
}
}
/// <summary>
/// 调用微信下单接口 返回调微信支付的参数
/// </summary>
/// <param name="no">订单编号</param>
private WxPayData SetWeChat_Wap()
{
#region 返回调用app接口的参数
Log.Info(this.GetType().ToString(), "Native pay mode 2 url is producing...");
string strAccess_Token = Session["access_token"].ToString();
string strOpenid = Session["openid"].ToString();
WxPayData data = new WxPayData();
data.SetValue("body", "测试商品数据");//商品描述
data.SetValue("attach", "test");//附加数据
data.SetValue("out_trade_no", "123456");//随机字符串
data.SetValue("total_fee", Convert.ToInt32(0.01 * 100));//总金额
data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间
data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易结束时间
data.SetValue("goods_tag", "自学检测付费订单");//商品标记
data.SetValue("trade_type", "JSAPI");//交易类型
data.SetValue("product_id", "a11878d2-2c35-49fb-a31f-9d9e922af32e");//商品ID
data.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//异步通知地址
data.SetValue("openid", strAccess_Token);//异步通知地址
//data.SetValue("access_token", strOpenid);//异步通知地址
WxPayData result = WxPayApi.UnifiedOrder(data); //调用统一下单接口
string prepayid = result.GetValue("prepay_id").ToString(); //获得统一下单接口返回的支付交易会话ID
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
string timestamp = Convert.ToInt64(ts.TotalSeconds).ToString();
data = new WxPayData(); //调App接口参数
data.SetValue("appId", WxPayConfig.APPID);//公众账号ID
//data.SetValue("partnerid", WxPayConfig.MCHID);//商户号
data.SetValue("package", "prepay_id="+ prepayid);//支付交易会话ID
data.SetValue("nonceStr", WxPayApi.GenerateNonceStr());//随机字符串
//data.SetValue("package", "Sign=WXPay");//扩展字段
data.SetValue("timeStamp", timestamp);//时间戳
data.SetValue("signType", "MD5");//签名
data.SetValue("paySign", data.MakeSign());//签名
return data; //调用app接口参数
#endregion
}
#endregion
}
}
可以给微信的例子下下来,对于我们小白来说看看根据例子改改,加上页面与控制器就可以了
最后记得给控制器路径加入到微信公众号支付》支付授权目录的白名单,在手机上测试就可以啦