zoukankan      html  css  js  c++  java
  • 微信公众号开发 (福利贴)(微信支付不得不说的坑)

      最近刚接触的微信公众号,看了半天的Api文档,直接就上手开发了,用了几天的时间,结束了公众号支付的任务。

      首先,需要准备的东西是:1、微信公众号;2、支付申请;3、公众号配置(坑);4、开发。

      微信公众号申请

      一般开通就行了,https://mp.weixin.qq.com,度娘一下就行了;此处可以省略;

      支付申请

      要缴费才给开通,之后上传相关的资料,审核通过之后,一般一个多星期就能够搞定;

      公众号配置

      (1)【配置oAuth2网页授权】,这个需要申请公众号开发者【开发】-【接口权限】-【网页授权】-【修改】-【网页授权域名】 注意,该域名填写,必须严格按照提示填写,目前的格式是:域名(不带http://或者https://),例如:www.baidu.com ,对了,这里只要是备案过的域名,不分一二级域名

      (2)【支付目录配置】,这个分两种【支付授权目录】和【测试授权目录】,第一种是正式的支付授权目录,mvc框架的话,这种精确至Controller,例如:http://www.baidu.com/Pay/,第二种也跟前一种差不多,只是需要添加测试白名单;

      (3)开发中所需要的参数:

        MCHID:在【微信支付】-【商户信息】-【基本信息】;

        APPID:【基本配置】-【开发者ID】-【】 ;

        APPSECRET:【基本配置】-【开发者ID】-【】 ;

        KEY:登录商户平台 【账户中心】-【API安全】-【设置密钥】,自己设置的;

      做完以上的步骤,就可以开始开发了。

      下载官方的demo下载,但是WebForm版本的,其实,大体上是差不多的。

    控制器

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using WxPayAPI;
    
    namespace MVC_WxPay_Demo.Controllers
    {
        public class WxPayController : Controller
        {
            /// <summary>
            /// 调用js获取收货地址时需要传入的参数
            /// 格式:json串
            /// 包含以下字段:
            /// appid:公众号id
            /// scope: 填写“jsapi_address”,获得编辑地址权限
            /// signType:签名方式,目前仅支持SHA1
            /// addrSign: 签名,由appid、url、timestamp、noncestr、accesstoken参与签名
            /// timeStamp:时间戳
            /// nonceStr: 随机字符串
            /// </summary>
            public static string wxEditAddrParam { get; set; }
            /// <summary>
            /// openId
            /// </summary>
            public static string openid { get; set; }
            /// <summary>
            /// 授权后微信端返回的code(用于获取openid和access_token)
            /// </summary>
            public static string code { get; set; }
            /// <summary>
            /// H5调起JS API参数
            /// </summary>
            public static string wxJsApiParam { get; set; }
            [AllowAnonymous]
            public ActionResult Index()
            {
           JsApiPay jsApiPay
    = new JsApiPay(HttpContext); jsApiPay.GetOpenidAndAccessToken(); if (jsApiPay.openid != null) { openid = jsApiPay.openid; GetJsApiParameters(); } ViewBag.Params = wxJsApiParam; return View(); } /// <summary> /// 获取前端参数 /// </summary> private void GetJsApiParameters() { if (openid != null) { //若传递了相关参数,则调统一下单接口,获得后续相关接口的入口参数 JsApiPay jsApiPay = new JsApiPay(HttpContext); jsApiPay.openid = openid; jsApiPay.total_fee = 1; //1分钱 jsApiPay.attach = "test"; jsApiPay.goods_tag = "test"; jsApiPay.body = "body"; //jsapi支付预处理 try { WxPayData unifiedorderresult = jsApiPay.GetUnifiedOrderResult(); wxJsApiParam = jsApiPay.GetJsApiParameters();//获取h5调起js api参数 } catch (Exception ex) { } } } /// <summary> /// 回调 /// </summary> public void Notify() { } } }

    Index视图

    @{
        ViewBag.Title = "Pay";
    }
    <!DOCTYPE html>
    
    <html>
    <head>
        <title>@ViewBag.Title</title>
        <script type="text/javascript">
    
        //调用微信JS api 支付
        function onBridgeReady(){
            WeixinJSBridge.invoke(
                'getBrandWCPayRequest',@Html.Raw(ViewBag.Params) ,
                function(res){
                    if (res.err_msg == "get_brand_wcpay_request:ok") {
                    }     // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。
                    else{
                    }
                    window.location.href='/WxPay/Notify';
                }
            );
        }
        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{
            onBridgeReady();
        }
    
        </script>
    </head>
    <body>
        <div>
        </div>
    </body>
    </html>

      Index()里面如何改,自己发挥,一定要保证通过身份验证之后,微信回调能够再次调用GetOpenidAndAccessToken()。

      之后,将需要用到的business文件夹中的JsApiPay.cs,NativeNotify.cs和utils文件夹中的Config.cs,Data.cs,HttpService.cs,Notify.cs,WxPayApi.cs 引用进来便可以了。

      贴完代码,就要来说说里面的坑了,那些不得不说的坑,首先,要分清楚,HttpContext是什么鬼?如ajax请求,例如:用post或者get,http://xxx.com/WxPay/Index 这个的话,会出现微信带Code参数的回调请求失败,出现302,是因为微信通过身份验证之后会回调设置好的redirect_url,同样的用ajax去身份验证的,回调也是用ajax, 然后会出现跨域的问题,所以,需要前端那边用location直接跳转新页面到http://xxx.com/WxPay/Index ,切记,一定要跳转新页面!至于要带什么参数,根据业务需要传;至于还有什么其他坑.其实也不是坑,严格按照文档走,类似键值对的顺序、签名的大小写问题等等,这些也是需要注意的,不过好在微信返回的错误码以及错误信息都是比较齐全跟明确的,查看文档就可以继续往下走。

      写好这些,估计就没什么问题了,有问题可以一起交流。

      最后,附上自己的写的Demo,仅供参考:百度云:MVC_WxPay_Demo.zip
                        Github:MVC_WxPay_Demo.zip

      觉得可以帮忙顶一下,谢谢。

        

      QQ交流群:523490820

  • 相关阅读:
    Google Shell Style Guide
    50 Must-have plugins for extending Twitter Bootstrap
    HTTP 请求头中的 X-Forwarded-For
    如何让 PowerPoint 幻灯片「高大上」?
    数据挖掘系列(1)关联规则挖掘基本概念与Aprior算法
    关于大型网站技术演进的思考(三)--存储的瓶颈(3)
    基于 Nginx XSendfile + SpringMVC 进行文件下载
    如何成为全栈工程师?
    Sqlserver通过列名查表名
    animate
  • 原文地址:https://www.cnblogs.com/lycsmzl/p/6043876.html
Copyright © 2011-2022 走看看