C# 微信支付之公众号支付
第一次接触微信支付这块, 把微信支付的sdk研究了很久,也 在网上找了很多的资料 记录一下 防止哪天忘记。
微信支付步骤:
1,获取code
2,获取access_token 和用户openID
3,查询订单详情
4,初始化微信支付环境
6,提交充值数据
5,调统一下单接口 ,获得后续相关接口的入口参数
6,完成支付
(一)、获取code ,access_token 和用户openID 在支付接口上都可以直接使用。 所以不做介绍了 , 直接到第四步。
(二)、放上支付核心的代码 及js (这里也是用的支付接口 但是根据需要做了修改)
1 //初始化微信支付环境 2 function fCharge() { 4 if (typeof WeixinJSBridge == "undefined") { 5 if (document.addEventListener) { 6 document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); 7 } else if (document.attachEvent) { 8 document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 9 document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); 10 } 11 } else { 12 fPostCharge(); 13 } 14 }
1 //提交充值数据 2 function fPostCharge() { 3 var total_fee = $("#total_fee").val(); 4 total_fee = parseInt(total_fee)*100; 5 if (total_fee > 0) { 6 $.messager.progress({ 7 title: "", 8 msg: "正在调用微信支付接口,请稍后..." 9 }); 10 $.ajax({ 11 type: "post", 12 data: {total_fee:total_fee,projectID:@Model.ID}, 13 url: "@Url.Action("JSAPIPay", "WeChat")", 14 success: function (json) { 15 if(json.message == false){ 16 location.href="@Url.Action("Error", "WeChat")"; 17 }else{ 18 $.messager.progress('close');//记得关闭 19 20 onBridgeReady(json.objResult); 21 } 23 }, 24 error: function () { 25 $.messager.progress('close');//记得关闭 26 $.messager.alert("提示", '调用微信支付模块失败,请稍后再试。', 'info') 27 } 28 }) 29 } 30 else { 31 alert("金额不可以为空或者为负数,请确认后再试.") 32 } 33 }
后台接收
1 public ActionResult JSAPIPay(string total_fee, int projectID) 2 { 3 object objResult = ""; 4 //JSAPI支付预处理 5 try 6 { 7 if (Session["openid"] != null) {15 //若传递了相关参数,则调统一下单接口,获得后续相关接口的入口参数 16 var project = REAS_BLL.bll_Project.GetByID(projectID); 17 18 JsApiPay jsApiPay = new JsApiPay(); 19 jsApiPay.openid = Session["openid"].ToString(); 20 jsApiPay.total_fee = Convert.ToInt32(total_fee); 21 jsApiPay.product_id = project.ID; 22 jsApiPay.body = project.Name + "(" + project.ReportNo + ")"; 23 24 WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(); 25 WxPayData wxJsApiParam = jsApiPay.GetJsApiParameters();//获取H5调起JS API参数 26 27 ModelForOrder aOrder = new ModelForOrder() 28 { 29 appId = wxJsApiParam.GetValue("appId").ToString(), 30 nonceStr = wxJsApiParam.GetValue("nonceStr").ToString(), 31 packageValue = wxJsApiParam.GetValue("package").ToString(), 32 paySign = wxJsApiParam.GetValue("paySign").ToString(), 33 timeStamp = wxJsApiParam.GetValue("timeStamp").ToString(), 34 msg = "成功下单,正在接入微信支付." 35 }; 36 objResult = aOrder;
37 } 39 } 40 catch (Exception ex) 41 { 42 ModelForOrder aOrder = new ModelForOrder() 43 { 44 appId = "", 45 nonceStr = "", 46 packageValue = "", 47 paySign = "", 48 timeStamp = "", 49 msg = "下单失败,请重试,多次失败,请联系管理员." 50 }; 51 objResult = aOrder; 52 Log.Error(this.GetType().ToString(), ex.Message.ToString()); 53 } 54 return Json(new { Success= true, objResult }, JsonRequestBehavior.AllowGet); 55 }
1 //调用微信支付模块 2 function onBridgeReady(json) { 3 WeixinJSBridge.invoke( 4 'getBrandWCPayRequest', { 5 "appId": json.appId, //公众号名称,由商户传入 6 "timeStamp": json.timeStamp, //时间戳,自1970年以来的秒数 7 "nonceStr": json.nonceStr, //随机串 8 "package": json.packageValue, 9 "signType": "MD5", //微信签名方式: 10 "paySign": json.paySign //微信签名 11 }, 12 function (res) { 13 if (res.err_msg == "get_brand_wcpay_request:ok") { 16 var total_fee = $("#total_fee").val(); 17 total_fee = parseInt(total_fee); 18 window.location.href = "@Url.Action("ProductPage", "WeChat")?total_fee="+total_fee+"&projectId="+@Model.ID; 19 fAlreadyPay(); 20 } // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。 21 } 22 ); 23 }