微信H5支付三步轻松搞定(C#)

目前,从商城网站、餐厅、商场、超市到菜市、小卖部、路边摊,移动支付无处不在,极大地方便了我们的生活。特别是微信支付,应用极广,很受大众欢迎。然而,对于拥有H5移动商城的商家来说,微信支付只能在微信客户端内实现,而在微信中又无法使用支付宝,这是令人非常蛋疼的事。

现在,好消息来了!微信已全面开放了H5支付功能,它将实现在微信客户端之外的H5商城网页场景完成支付,极大地满足了商家的收款需求和买家便捷支付的要求。

好东西当然不能错过,但如何快速将H5支付功能嵌入到您的H5商城中呢?微信并没有提供官方Demo可以参考。没关系,按照本文的方法,您不需要再花精力做额外的开发,只需三步就能轻松搞定。

【我的思路】既然H5支付也是通过调用统一下单接口来实现,那么直接用官方提供的公众号支付SDK(WxPayAPI_CS_v3)进行扩展和修改不就行了吗?省时省力(本人比较懒,能不折腾就尽量不折腾,哈哈)。

【准备工作】一、您已经调通了WxPayAPI_CS_v3(可以正常实现公众号支付),二、您已经开通了H5支付功能(需要去微信商户平台上申请开通)。对这方面不清楚的朋友请查阅相关文档,它不是本文所要讨论的话题。

现在,就让我们开始吧!

第一步

在WxPayAPI/ business文件夹下添加一个类,将其命名为H5Pay(可从JsApiPay.cs中复制相关代码进行修改,重点是将交易类型trade_type设置为MWEB,另外还要传递终端IP),H5Pay.cs的完整代码如下:

using System.Web;

namespace WxPayAPI

{

    public class H5Pay

    {

        public string GetPayUrl(string thip)

        {

            Log.Info(this.GetType().ToString(), "H5 pay url is producing...");

            WxPayData data = new WxPayData();

            data.SetValue("body",”商品描述”); //这里替换成你的数据

            data.SetValue("attach", "详见我的订单");//这里替换成你的数据

            data.SetValue("out_trade_no",”商户订单号”); //这里替换成你的数据

            data.SetValue("total_fee",”总金额”); //这里替换成你的数据

            data.SetValue("spbill_create_ip", thip);// 终端IP

            data.SetValue("trade_type", "MWEB");//交易类型

            data.SetValue("scene_info", "{'h5_info':{'type':'Wap','wap_url':'你的H5域名','wap_name':'你的商城名称'}}");//场景信息

            WxPayData result = WxPayApi.UnifiedOrder(data);//调用统一下单接口

            string url = result.GetValue("mweb_url").ToString();//获得统一下单接口返回的链接

            Log.Info(this.GetType().ToString(), "Get H5 pay url : " + url);

            return url;

        }

    }

}

说明:GetPayUrl方法将返回微信支付中间页的跳转URL(即统一下单接口返回的mweb_url参数)。

第二步

在example文件夹下添加一个Web窗体,将其命名为H5PayPage,前台H5PayPage.aspx里不需要添加任何东西,在H5PayPage.aspx.cs中添加相关代码,其完整代码如下:

using System;

using System.Web;

namespace WxPayAPI

{

    public partial class H5PayPage : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            Log.Info(this.GetType().ToString(), "page load");

            H5Pay h5Pay = new H5Pay();

            string scip = GetIP();//获取客户端真实IP

            string url = h5Pay.GetPayUrl(scip);//通过统一下单接口进行H5支付

            Response.Redirect(url); //跳转到微信支付中间页

        }


        //因H5支付要求商户在统一下单接口中上传用户真实ip地址“spbill_create_ip”,故需要调用以下方法。

        public string GetIP()

        {

            HttpRequest request = HttpContext.Current.Request;

            string result = request.ServerVariables["HTTP_X_FORWARDED_FOR"];

            if (string.IsNullOrEmpty(result))

            {

                result = request.ServerVariables["REMOTE_ADDR"];

            }

            if (string.IsNullOrEmpty(result))

            {

                result = request.UserHostAddress;

            }

            if (string.IsNullOrEmpty(result))

            {

                result = "0.0.0.0";

            }

            return result;

        }

    }

}

第三步

打开WxPayAPI/lib/WxPayApi.cs文件,找到UnifiedOrder方法,再找到如下4行原代码:

inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID

inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号

inputObj.SetValue("spbill_create_ip", WxPayConfig.IP);//终端ip

inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串

将其修改为:

//若终端IP未设置,则使用配置文件中的终端IP

if (!inputObj.IsSet("spbill_create_ip"))

{

inputObj.SetValue("spbill_create_ip", WxPayConfig.IP);//终端IP

}

inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID

inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号

inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串

说明:因为原代码传递给调用统一下单接口的终端IP是配置文件Config.cs中的默认值(8.8.8.8),这样肯定会出错(H5支付要求上传用户真实IP),因此需要加上一个判断,即如果已经设置了终端IP则不使用默认值。

OK,这样就行了,是不是非常简单?

【最后要说的】其它平台(如PHP、java等)照此思路操作也是一件很轻松的事儿。H5支付结果异步回调通知与公众号支付(JSAPI支付)和扫码支付都是统一的接口,如果你之前已做好了更新订单的逻辑处理,那现在就不需要做重复劳动了,是不是很爽?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容