iOS國稅局發(fā)票二維碼生成

近端時間,領導提了一個需求留攒。說是微信中的發(fā)票管理下面帶有二維碼捌斧,通過掃描二維碼就可以開票,省去了每次開票都要仔細的核對發(fā)票信息的麻煩西土。
領導要求我們自己的app中發(fā)票管理盡量向微信靠攏讶舰。 通過查找資料,了解了制作發(fā)票二維碼的流程,特意在這里記錄一下跳昼。

1. 國稅局發(fā)布的制作二維碼規(guī)范

國家稅務總局辦公廳關于采用二維碼便捷納稅人開具增值稅發(fā)票有關事項的通知

截圖

便捷開票二維碼應用規(guī)范

2. 自己的理解

根據(jù)上面的規(guī)范般甲,明白需要把公司的信息(企業(yè)名稱,納稅人識別號鹅颊,注冊地址敷存,聯(lián)系電話,開戶行名稱堪伍,開戶行賬號)等字符串整合成一個字符串锚烦。

格式如下:起始符 + 版本號 + base64(企業(yè)名稱</>納稅人識別號</>注冊地址聯(lián)系電話</>開戶行名稱開戶行賬號</>CRC) + 結束符

  • CRC是把(企業(yè)名稱</>納稅人識別號</>注冊地址聯(lián)系電話</>開戶行名稱開戶行賬號</>)括號中的字符串生成一個驗證碼
  • base64是把(企業(yè)名稱</>納稅人識別號</>注冊地址聯(lián)系電話</>開戶行名稱開戶行賬號</>CRM驗證碼)這個字符串加密。

注意開戶行名稱開戶行賬號 是在兩個</>之間的一個字符串杠娱,但是需要在開戶行名稱和開戶行賬號中間加一個“|”的英文符號挽牢。注冊地址聯(lián)系電話 也是需要在中間添加“|”谱煤。這個規(guī)范中沒寫摊求,但是必須添加的。不添加會在解析時當成一個字符串刘离,而不是顯示各自的信息室叉。

在線驗證網(wǎng)址:

CRC(循環(huán)冗余校驗)在線計算

BASE64方式加密、解密在線

3. 使用CRC驗證的經(jīng)驗

根據(jù)上面的規(guī)范硫惕,CRM驗證使用的是CRC-16算法茧痕,高位在前,低位在后恼除。在通過對比踪旷,發(fā)現(xiàn)CRC-16/CCITT- FALSE 和 CRC16_XMODEM兩個都滿足。所以我就選擇了使用CRC-16/CCITT- FALSE來生成驗證碼豁辉。

在IOS中我是使用的 喝小酒的網(wǎng)摘的文章中的C語言編寫的方法令野。大概代碼如下:


// 轉(zhuǎn)碼,返回的是unsigned short
unsigned short CRC16_CCITT_FALSE(unsigned char *puchMsg, unsigned int usDataLen)
{
    unsigned short wCRCin = 0xFFFF;
    unsigned short wCPoly = 0x1021;
    unsigned char wChar = 0;
    
    while (usDataLen--)
    {
        wChar = *(puchMsg++);
        wCRCin ^= (wChar << 8);
        for(int i = 0;i < 8;i++)
        {
            if(wCRCin & 0x8000)
                wCRCin = (wCRCin << 1) ^ wCPoly;
            else
                wCRCin = wCRCin << 1;
        }
    }
    return (wCRCin) ;
}

/// 需要把上面方法返回的unsign short 轉(zhuǎn)化為二進制類型
+ (NSString *)getBinaryByDecimal:(NSInteger)decimal {
    
    NSString *binary = @"";
    while (decimal) {
        
        binary = [[NSString stringWithFormat:@"%ld", decimal % 2] stringByAppendingString:binary];
        if (decimal / 2 < 1) {
            
            break;
        }
        decimal = decimal / 2 ;
    }
    if (binary.length % 4 != 0) {
        
        NSMutableString *mStr = [[NSMutableString alloc]init];;
        for (int i = 0; i < 4 - binary.length % 4; i++) {
            
            [mStr appendString:@"0"];
        }
        binary = [mStr stringByAppendingString:binary];
    }
    return binary;
}

調(diào)用方法:

+ (NSString *)stringCRC16_CCITT_FALSEWithData:(NSData *)data dataLength:(NSInteger)dataLength {
    unsigned short wcrcin = CRC16_CCITT_FALSE((Byte *)[data bytes], (int)dataLength);
    //十進制轉(zhuǎn)二進制
    return [NSString getBinaryByDecimal:wcrcin];
}

4. base64加密徽级。

base64加密這個網(wǎng)上都有气破,并且也有第三方的文件,原理我也不太明白餐抢∠质梗可以自己去網(wǎng)上搜索,這個比較常見旷痕。

5. 完成效果

生成二維碼以后碳锈,需要使用微信公眾號上的《國稅發(fā)票助手》來驗證,切記別用微信自己的欺抗,剛開始就犯了這個錯誤殴胧,微信是自己開發(fā)的,只能用微信的格式來掃描分享。

公眾號
掃描結果

6. 總結

需要注意如下:

  • 開戶行名稱開戶行賬號 兩個信息中間一定要加“|”团滥。

  • CRC生成驗證時竿屹。我查資料JAVA使用的CRC-16驗證方法生成的二進制編碼跟C語言生成的不一樣。因為測試的時候在線測試使用JAVA生成的二進制可以用灸姊,就一直糾結為什么不一樣拱燃。不過使用C語言生成的通過測試也能用。

7. 參考資料

便捷開票二維碼應用規(guī)范中的那些坑

喝小酒的網(wǎng)摘-CRC16常見幾個標準的算法及C語言實現(xiàn)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末力惯,一起剝皮案震驚了整個濱河市碗誉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌父晶,老刑警劉巖哮缺,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異甲喝,居然都是意外死亡尝苇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門埠胖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糠溜,“玉大人,你說我怎么就攤上這事直撤》歉停” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵谋竖,是天一觀的道長红柱。 經(jīng)常有香客問我,道長蓖乘,這世上最難降的妖魔是什么锤悄? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮驱敲,結果婚禮上铁蹈,老公的妹妹穿的比我還像新娘。我一直安慰自己众眨,他們只是感情好握牧,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娩梨,像睡著了一般沿腰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狈定,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天颂龙,我揣著相機與錄音习蓬,去河邊找鬼。 笑死措嵌,一個胖子當著我的面吹牛躲叼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播企巢,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枫慷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浪规?” 一聲冷哼從身側響起或听,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笋婿,沒想到半個月后誉裆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡缸濒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年足丢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绍填。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡霎桅,死狀恐怖栖疑,靈堂內(nèi)的尸體忽然破棺而出讨永,到底是詐尸還是另有隱情,我是刑警寧澤遇革,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布卿闹,位于F島的核電站,受9級特大地震影響萝快,放射性物質(zhì)發(fā)生泄漏锻霎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一揪漩、第九天 我趴在偏房一處隱蔽的房頂上張望旋恼。 院中可真熱鬧,春花似錦奄容、人聲如沸冰更。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜀细。三九已至,卻和暖如春戈盈,著一層夾襖步出監(jiān)牢的瞬間奠衔,已是汗流浹背谆刨。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留归斤,地道東北人痊夭。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像脏里,于是被迫代替她去往敵國和親生兆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容