接入微信电子发票流程步骤

一、流程图

  电子发票流程涉及用户、商户、报销方、发票平台和公众平台五个角色。
  对于自建发票平台的商户,发票平台即为商户自身的开票系统,承担着制作发票卡券、将发
  票卡券插入用户卡包以及报销状态更新的关键作用。

二、步骤及页面

  步骤1:检查是否微信打开

  步骤2:检查微信版本是否高于或者等于6.0.2版本

//"Mozilla/5.0(iphone;CPU iphone OS 5_1_1 like Mac OS X)
//AppleWebKit / 534.46(KHTML, like Geocko)Mobile / 9B206 MicroMessenger/ 6.0.2 "
//其中6.0.2为用户安装的微信版本号。商户可以判定版本号是否高于或者等于6.0.2。

  步骤3:检查发票是否真实存在

  步骤4:获取微信token

        /// <summary>
        ///获取微信token
        /// </summary>
        /// <returns></returns>
        public static string GetToken()
        {
            string CGIBaseUrl = GlobalConfig.Settings["WechartBaseUrl"];
            string AppId = GlobalConfig.Settings["EfpgjAppId"];
            string security = GlobalConfig.Settings["EfpgjSecurity"];
            ObjectCache oCache = MemoryCache.Default;
            string fileContents = oCache["wechart_token"] as string;
            if (fileContents == null)
            {
                var url = string.Format("{0}/token?grant_type=client_credential&appid={1}&secret={2}",
                CGIBaseUrl + "/cgi-bin", AppId, security);
                using (WebClient client = new WebClient())
                {
                    client.Encoding = Encoding.UTF8;
                    string data = client.DownloadString(url);
                    var result = JObject.Parse(data);
                    if (result["access_token"] != null && result["access_token"].Value<string>() != string.Empty)
                    {
                        CacheItemPolicy policy = new CacheItemPolicy();
                        policy.AbsoluteExpiration = DateTime.Now.AddMinutes(120);//取得或设定值,这个值会指定是否应该在指定期间过后清除
                        fileContents = result["access_token"].Value<string>();
                        oCache.Set("wechart_token", fileContents, policy);
                    }
                }
            }
            return fileContents;
        }    

  步骤5:获取发票平台 s_pappid

  步骤6:获取发票 ticket

        /// <summary>
        /// 获取临时Ticket
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public static string GetTicket(string token)
        {
            ObjectCache oCache = MemoryCache.Default;
            string fileContents = oCache["wechart_ticket"] as string;
            if (fileContents == null)
            {
                string CGIBaseUrl = GlobalConfig.Settings["WechartBaseUrl"];
                var url = string.Format("{0}/cgi-bin/ticket/getticket?access_token={1}&type=wx_card",
                    CGIBaseUrl, token);
                var data = string.Empty;
                var arg = new
                {
                    access_token = token
                };
                var paramStr = JsonConvert.SerializeObject(arg);
                using (var client = new WebClient())
                {
                    client.Encoding = Encoding.UTF8;
                    data = client.UploadString(url, paramStr);
                }
                var result = JObject.Parse(data);
                CacheItemPolicy policy = new CacheItemPolicy();
                policy.AbsoluteExpiration = DateTime.Now.AddMinutes(120);//取得或设定值,这个值会指定是否应该在指定期间过后清除
                fileContents = result["ticket"].Value<string>();
                oCache.Set("wechart_ticket", fileContents, policy);
            }
            return fileContents;
        }

  步骤7:获取授权页链接URL

        /// <summary>
        /// 获取授权页链接
        /// </summary>
        /// <param name="CGIBaseUrl"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public static string GetAuthUrl(string token, EInvoice invoice, int flags)
        {
            var spid = CheckToken(token);
            try
            {
                string CGIBaseUrl = GlobalConfig.Settings["WechartBaseUrl"];
                var url = string.Format("{0}/card/invoice/getauthurl?access_token={1}",
                        CGIBaseUrl, token);
                var data = string.Empty;
                var arg = new
                {
                    s_pappid = spid,
                    order_id = invoice.SwiftNumber,
                    money = invoice.SummaryAmount * 100,
                    timestamp = ConvertDateTimeInt(DateTime.Now),
                    source = "web",
                    redirect_url = GlobalConfig.Settings["WechartEIUrl"] + "/#!/wechartCardReturn/" + invoice.Id+"/"+invoice.CustomerName + "/" + flags,
                    //redirect_url = "http://eiapp.chinacloudsites.cn" + "/#!/testInsertcardCpt/" + SwiftNumber,
                    ticket = GetTicket(token),
                    type = 2,//授权类型, 0:开票授权, 1:填写字段开票授权, 2:领票授权
                };
                var paramStr = JsonConvert.SerializeObject(arg);
                using (var client = new WebClient())
                {
                    client.Encoding = Encoding.UTF8;
                    data = client.UploadString(url, paramStr);
                }
                var result = JObject.Parse(data);
                if (result["auth_url"] != null && result["auth_url"].Value<string>() != string.Empty)
                {
                    return result["auth_url"].Value<string>();
                }
                else
                    return data;
            }
            catch (Exception ex)
            {
                return spid + "/" + token + "/" + ex.Message;
            }
        }

  步骤8:步骤7接口字段:授权成功后跳转页面,此页面中进行创建卡券-将电子发票插入用户卡包中操作

时间: 2024-10-17 05:00:56

接入微信电子发票流程步骤的相关文章

如何领购和作废电子发票流程

此文为山东税务相关的流程,由于不同地区流程不同,所以导致办事之前百度的结果不一定准确,搜索引擎搜到的流程随着时间和地区不同,都可能有差异,而且搜索引擎搜到的很多词汇也不容易理解.开具和交付,请查看本博客相关博文:如何开具和交付给客户电子发票 此文为领购和作废发票流程 发票作废:目前只有普票有电子发票,但是有些公司比较严格,普票无法报销,需要专票,最近需要作废一张电子发票,开成专票.发现金税盘没有作废电子发票的选项,上网百度了一下,知道了电子发票不那个作废,可以冲红.冲红步骤和普通发票跨月冲红一样

asp.net 微信企业号办公系统-流程设计--流程步骤设置-事件设置

事件设置是设置当前步骤在提交前后或退回前后要执行的一些操作(该事件为服务器事件). 事件格式为:dll名称.命名空间名称.类名.方法名,这里不需要写括号和参数,处理时会自动带上当前流程实例的相关参数. 参数为:RoadFlow.Data.Model.WorkFlowCustomEventParams类的实例,里面包含当前流程步骤的相关信息. FlowID:当前流程ID. StepID:当前步骤ID. GroupID:当前流程实例的分组ID,一个流程实例的分组ID相同,此ID是为了区分一个流程的不

asp.net 微信企业号办公系统-流程设计--流程步骤设置-基本设置

流程属性设置完成后点击确定之后,即可进行流程步骤设置了. 点击工具栏上的步骤按钮,即可添加一个新步骤. 在新步骤图形上双击即可弹出该步骤相应属性设置框. 步骤ID:系统自动为该步骤生成的唯一ID. 步骤名称:该步骤的名称. 意见显示:是否在审批表单的底部显示历史步骤的审批意见,如果选择了显示则会如下图显示历史意见: 审签类型:无签批意见栏:在表单底部没有签批意见栏,该步骤不需要签批意见即可发送,有签批意见栏(无须签章):在表单底部有签批意见栏,但没有签章按钮,此步骤需要签意见,但不须要签章,有签

商户如何接入微信支付

1. 商户接入 1.1 申请流程指引 一.申请流程图 二.申请接入步骤详细说明 (一)成为已认证的服务号 1.目前微信支付功能仅开放给已经通过微信认证的服务号(企业.商店商家.非事业单位媒体类服务号),若已经通过微信认证,且是服务号,可直接进入第二步;2.订阅号商户可先升级为服务号,此步骤约1个工作日;3.未经认证的商户可先申请微信认证.注意:请申请认证的商户主体与后续申请微信支付权限的商户主体保持一致. (二)提交申请资料,等待审核 1.登录公众号,进入:服务-服务中心-商户功能; 2.提交商

iOS 微信开发详细流程

这个文章写的 比较不错 借此转发. SDK下载:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1 APP端开发步骤说明:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_5 SDK接入 服务器签名版本 官方已经是建议使用服务器签名来接入微信支付,实际上从安全上考虑,确实是每个客户端不应该知道RAS密钥,也不需要每个客户端都写一遍签名的算法. 服务端接入流程文档:h

第三方App接入微信登录 解读(转)

转自http://blog.csdn.net/luoyan973387349/article/details/49815225 , 更多详细资料请参考原文 最近在做一个微信登录功能,发现腾讯的API文档写的实在是让人摸不着头脑,也没有搜到很详细的能让人参考的文章,借此把自己的一点儿使用心得与大家分享,欢迎指正其中的不足之处,谢谢! 准备工作 1.在微信开放平台https://open.weixin.qq.com/注册成为开发者. 2.在“管理中心”中创建一个移动应用,需“应用名称.简介.及28*

应用接入微信登录-步步为赢

接入微信登录: 1.准备工作 1.在微信开放平台https://open.weixin.qq.com/注册成为开发者. 2.在"管理中心"中创建一个移动应用,需"应用名称.简介.及28*28和108*108的PNG图片各一张,且大小不超过300k",点击下一步,需"应用官网地址,应用签名及包名"等信息,然后即可提交审核. 说明: 应用签名:可在微信开发平台的资源中心>>资源下载>>中下载"签名生成工具"

第三方App接入微信登录

微信登录接入 微信登录遵循协议Aouth2.0中的授权码模式 我们来看一下Aouth2.0中的授权码模式是怎么定义的: 授权码模式(authorization code)是功能最完整.流程最严密的授权模式.它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动. 它的步骤如下: (A)用户访问客户端,后者将前者导向认证服务器. (B)用户选择是否给予客户端授权. (C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redi

Java微信公众平台开发(一)--接入微信公众平台

转自:http://www.cuiyongzhi.com/post/38.html (一)接入流程解析 在我们的开发过程中无论如何最好的参考工具当然是我们的官方文档了:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html 通过文档我们可以看出其中接入微信公众平台开发,开发者需要按照如下步骤完成: 填写服务器配置 验证服务器地址的有效性 依据接口文档实现业务逻辑 按照上面的逻辑可能是填写服务器配置信息是在第一步,但