文章出處

一、流程圖

  電子發票流程涉及用戶、商戶、報銷方、發票平臺和公眾平臺五個角色。
  對于自建發票平臺的商戶,發票平臺即為商戶自身的開票系統,承擔著制作發票卡券、將發
  票卡券插入用戶卡包以及報銷狀態更新的關鍵作用。

二、步驟及頁面

  步驟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;
        }    
View Code

  步驟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;
        }
View Code

  步驟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;
            }
        }
View Code

  步驟8:步驟7接口字段:授權成功后跳轉頁面,此頁面中進行創建卡券-將電子發票插入用戶卡包中操作

 

       

 

 

 

         

 

 

參考資料:https://fapiao.weixin.qq.com/cgi-bin/devdoc 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()