找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8055|回復(fù): 16
收起左側(cè)

單片機(jī)+RC522讀FM1208 CPU卡程序 定額消費(fèi)帶PSAM卡操作12864顯示

  [復(fù)制鏈接]
ID:441108 發(fā)表于 2018-12-6 18:01 | 顯示全部樓層 |閱讀模式
52單片機(jī)驅(qū)動(dòng)rc522讀cpu卡資料包:
0.png

單片機(jī)源程序如下:
  1. #include "reg52.h"
  2. #include <string.h>
  3. #include <intrins.h>
  4. #include "main.h"
  5. #include "RC522.H"
  6. #include "12864.h"
  7. #include "uart.h"
  8. #include "FM1208.H"
  9. #include "psam.h"



  10. unsigned char  Serial_Num[8];   //用戶卡序列號(hào)
  11. unsigned char code  S_KEY_1[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};                   //分散因子1(為自定義城市標(biāo)識(shí))
  12. unsigned char code  S_KEY_2[8]={0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11};                //分散因子2(為自定義各成員銀行標(biāo)識(shí))


  13. //////////////////文件標(biāo)識(shí)的定義/////////////////////////////////////////////////////////////////////////////////
  14. //
  15. //為統(tǒng)一方便管理閱讀代碼,我們?cè)谒械奈募竺婕觽(gè)_Flag,表示就是該對(duì)應(yīng)文件的標(biāo)識(shí)//
  16. //

  17. unsigned char code CZKey_Flag={0x01};                                          //圈存密鑰標(biāo)識(shí)為01
  18. unsigned char code DPKey_Flag={0x00};                                          //消費(fèi)密鑰標(biāo)識(shí)為00

  19. unsigned char code DF_ExKey_Flag  = {0x00};                      //DF下的外部密鑰標(biāo)識(shí)00
  20. unsigned char code DF_Inital_Key_Flag  = {0x00};                 //DF下的內(nèi)部密鑰標(biāo)識(shí)00

  21. unsigned char code FM1208_DF_0015_Flag[]={0x00,0x15};        //公共應(yīng)用基本數(shù)據(jù)文件標(biāo)識(shí)0015
  22. unsigned char code FM1208_DF_0016_Flag[]={0x00,0x16};        //持卡人基本信息數(shù)據(jù)的文件標(biāo)識(shí)0016

  23. ////////////////////////////////////////////////////////////////////////
  24. //文件標(biāo)識(shí)

  25. unsigned char code File_3F00[] ={0x3f,0x00};        //MF下的文件標(biāo)識(shí)3F00
  26. unsigned char code File_3F01[] ={0x3f,0x01};        //DF下的文件標(biāo)識(shí)3F01
  27. unsigned char code File_0016={0x16};                //終端機(jī)短文件標(biāo)識(shí)


  28. unsigned char      Temporary_Key[8];           


  29. unsigned char  xdata    Challenge_Num[8];  //隨機(jī)數(shù)
  30. unsigned char  code     DateTime[]={0x20,0x16,0x10,0x26,0x11,0x32,0x45};   //交易時(shí)間,如果板子帶有時(shí)鐘芯片,可以把實(shí)時(shí)時(shí)間寫入卡中。

  31. unsigned char  xdata    NameBuf[20];         //臨時(shí)存放姓名
  32. unsigned char  xdata    NameLen;                 //姓名長(zhǎng)度

  33. unsigned char code Purchase_Pay[4]={0x00,0x00,0x00,0x01}; //操作的金額 高位在前,16進(jìn)制計(jì)算的,定額消費(fèi)1元
  34. unsigned int xdata PAY;
  35. unsigned int xdata Pay_1 ;
  36. unsigned char xdata POSNum[6];                                                                   //終端機(jī)編號(hào)        從SAM卡中讀取


  37. unsigned char  xdata           g_cSNR[4];                              
  38. unsigned char  xdata           DataBuf[MAXRLEN];
  39. unsigned char  xdata         g_cReceBuf[MAXRLEN];                        




  40. void NameToStr(char *s)          //計(jì)算姓名的長(zhǎng)度,及臨時(shí)保存姓名
  41. {
  42.          char i;
  43.          NameLen=strlen(s);

  44.          for(i=0;i<NameLen;i++)
  45.                  NameBuf[i]=s[i];

  46. }

  47. void CLRBuff()
  48. {
  49.          memset(g_cReceBuf, 0x00, MAXRLEN);        //清0
  50.          memset(DataBuf, 0x00, MAXRLEN);
  51. }

  52. void Request_loop()
  53. {
  54.          s8 status,atq[2] ;
  55.     while(1)
  56.     {     
  57.         status = PcdRequest(PICC_REQALL, atq);
  58.         if(status != MI_OK)
  59.         {
  60.             status = PcdRequest(PICC_REQALL, atq);        
  61.                 if(status != MI_OK)
  62.                 break;
  63.         }
  64.     }
  65. }

  66. void main( )
  67. {   

  68.          unsigned  int xdata st;
  69.          unsigned char xdata tt[2];
  70.          unsigned char xdata i;
  71.          unsigned  char  status;

  72.      InitializeSystem( );
  73.          DelayMs(200);                                //等待上電穩(wěn)定
  74.          UART_Init();                                 //串口初始化
  75.          RC522_Init();                                //RC522初始化 ,         
  76.          initial_LCD();                        //顯示屏初始化

  77.         
  78.           if(PSAMInit(g_cReceBuf))   //PSAM卡初始化
  79.          {
  80.              UART_Send_Str("無(wú)PSAM卡,請(qǐng)插入PSAM卡!");
  81.                  UART_Send_Enter();
  82.              while(1);
  83.          }
  84.          UART_Send_Str("PSAM卡復(fù)位成功!");
  85.          UART_Send_Enter();
  86.          Dis_Deduct_Charge(0);                //12864顯示
  87.          
  88.          PcdAntennaOff();
  89.      DelayMs(3);
  90.          PcdAntennaOn();
  91.          CLRBuff();

  92.      while ( 1 )
  93.      {   
  94.                            
  95.                         st =PcdRequest(PICC_REQALL, tt);         //尋卡
  96.                         if(st){continue;}

  97.                         st =PcdAnticoll(g_cSNR);//防沖撞,
  98.                         if(st){continue;}
  99.                
  100.                         st =PcdSelect(g_cSNR); //選擇卡片
  101.                         if(st){continue;}
  102.                         
  103.    

  104.                         if (pro_reset(g_cReceBuf,tt)!=MI_OK)         //用戶卡(CPU卡)復(fù)位,成功后才能往下操作//
  105.                         {
  106.                                 CLRBuff();                                                               
  107.                             continue;
  108.                         }

  109.                         UART_Send_Enter();
  110.                         UART_Send_Enter();
  111.                         UART_Send_Str("用戶卡復(fù)位成功!");                  
  112.                         UART_Send_Enter();                                
  113.                         UART_Send_Enter();               
  114.                                                 
  115.                         ////////////////////////////////////////////////////////////////

  116.                            CLRBuff();
  117.                     st=Sam_Select_File(File_3F00, 2, 0,g_cReceBuf, 0x28 );        //選擇SAM卡中PBOC的3F00文件// 0x2E
  118.                     if(st!=SAM_OK)
  119.                     {
  120.                             UART_Send_Str("SAM卡3F00文件打開錯(cuò)誤:");
  121.                                 UART_Put_Num(g_cReceBuf,2);   //顯示錯(cuò)誤代碼
  122.                                 UART_Send_Enter();                           
  123.                                 CLRBuff();
  124.                                 Request_loop();                                                                       
  125.                             continue;        
  126.                     }

  127.                         CLRBuff();
  128.                         st=Sam_ReadBinary( File_0016,g_cReceBuf, 6 );         //讀取SAM卡里面的終端機(jī)編號(hào)//
  129.                     if(st!=SAM_OK)
  130.                     {
  131.                             UART_Send_Str("SAM卡的終端機(jī)編號(hào)讀取錯(cuò)誤:");
  132.                                 UART_Put_Num(g_cReceBuf,2);   //顯示錯(cuò)誤代碼
  133.                                 UART_Send_Enter();                           
  134.                                 CLRBuff();
  135.                                 Request_loop();                                                                       
  136.                             continue;
  137.                
  138.                     }
  139.                         UART_Send_Str("終端機(jī)編號(hào)為:");
  140.                         memcpy(POSNum, g_cReceBuf, 6);         
  141.                         UART_Put_Num(POSNum,6);
  142.                         
  143.                         UART_Send_Enter();



  144.                         CLRBuff();
  145.                     st=Sam_Select_File(File_3F01, 2, 0,g_cReceBuf, 0x27 );        //選擇SAM卡中PBOC的3F01文件
  146.                     if(st!=SAM_OK)
  147.                     {
  148.                             UART_Send_Str("SAM卡PBOC文件打開錯(cuò)誤:");
  149.                                 UART_Put_Num(g_cReceBuf,2);   //顯示錯(cuò)誤代碼
  150.                                 UART_Send_Enter();                           
  151.                                 CLRBuff();
  152.                                 Request_loop();                                                                       
  153.                             continue;
  154.                
  155.                     }
  156.                         UART_Send_Str("SAM卡PBOC文件打開成功!");
  157.                         UART_Send_Enter();
  158.                         UART_Send_Enter();
  159.                         
  160.                         CLRBuff();
  161.                         st=FM1208_SelectFile(File_3F01,g_cReceBuf,tt);      //打開CPU卡中PBOC的3F01文件//
  162.                         if(st!=0x9000)
  163.                         {        
  164.                                 if(st!=ST_ERR)
  165.                                 {
  166.                                         UART_Send_Str("用戶卡PBOC文件打開錯(cuò)誤!");
  167.                                         UART_Send_Enter();
  168.                                 }
  169.                                 CLRBuff();
  170.                                 Request_loop();                                                                       
  171.                             continue;
  172.                         }
  173.                         UART_Send_Str(">>用戶卡PBOC文件打開成功<<");
  174.                         UART_Send_Enter();
  175.                         UART_Send_Enter();

  176.                            CLRBuff();
  177.                         st=FM1208_Read_Binary(FM1208_DF_0015_Flag[1],g_cReceBuf, 0x1E );                  //讀取0015文件公共應(yīng)用基本數(shù)據(jù)//
  178.                         if(st!=0x9000)
  179.                         {        
  180.                                 if(st!=ST_ERR)
  181.                                 {
  182.                                         UART_Send_Str("公共應(yīng)用基本文件讀取失敗:");
  183.                                         UART_Put_Num(g_cReceBuf,2);
  184.                                         UART_Send_Enter();
  185.                                 }
  186.                                 CLRBuff();
  187.                                 Request_loop();                                                                       
  188.                             continue;
  189.                         }



  190.                          UART_Send_Str(">>公共應(yīng)用基本文件讀取成功<<");
  191.                          UART_Send_Enter();
  192.                          UART_Send_Enter();
  193.                     
  194.                          memcpy(Serial_Num, &g_cReceBuf[12], 8);   //拷入用戶卡序號(hào)
  195.                          UART_Send_Str("用戶卡序號(hào):");
  196.                          UART_Put_Num(Serial_Num,8);                                //用戶卡序號(hào)
  197.                          UART_Send_Enter();
  198.                     
  199.                          UART_Send_Str("啟動(dòng)日期:");
  200.                          UART_Put_Num(&g_cReceBuf[20],4);                                //這里可做判斷一張卡的生命周期
  201.                          UART_Send_Str("停用日期:");
  202.                          UART_Put_Num(&g_cReceBuf[24],4);                                
  203.                          UART_Send_Enter();
  204.                           
  205.                           
  206.                           
  207.                           
  208.                           
  209.                         //////////////////////////////////////////////////////////////
  210.                         //主要是用戶卡判斷終端的合法性,即是否是有人偽造的終端機(jī)
  211.                         
  212.                         st=FM1208_GetChallenge(8,Challenge_Num);                           //從用戶卡取一組隨機(jī)數(shù)//         
  213.                         if(st!=0x9000)
  214.                         {        
  215.                                 if(st!=ST_ERR)
  216.                                 {
  217.                                         UART_Send_Str("用戶卡讀取隨機(jī)碼錯(cuò)誤:");
  218.                                         UART_Put_Num(g_cReceBuf,2);
  219.                                         UART_Send_Enter();
  220.                                 }
  221.                                 CLRBuff();
  222.                                 Request_loop();                                                                       
  223.                             continue;
  224.                         }
  225.         

  226.                         UART_Send_Str("取得隨機(jī)數(shù)");
  227.                         UART_Put_Num(Challenge_Num,8);                                
  228.                         UART_Send_Enter();        
  229.                         CLRBuff();   
  230.                         st=Init_for_descrypt(Serial_Num, 0x8, 0x27,DF_ExKey_Flag, g_cReceBuf);     //用3DE初始化 1級(jí)分散產(chǎn)生過(guò)程密鑰   27--密鑰用途,為加密密鑰
  231.                     if(st!=SAM_OK)                                                                 
  232.                     {
  233.                             UART_Send_Str("SAM卡的3DES初始化失敗:");
  234.                                 UART_Put_Num(g_cReceBuf,2);   //顯示錯(cuò)誤代碼
  235.                                 UART_Send_Enter();                                                                              
  236.                                 CLRBuff();
  237.                                 Request_loop();                                                                       
  238.                             continue;               
  239.                     }
  240.                         CLRBuff();                        
  241.                         st=Descrypt(Challenge_Num, 0x8, 0, g_cReceBuf, 0x8 );           //3DES算法 對(duì)剛才臨時(shí)保存的隨機(jī)數(shù)進(jìn)行加密//
  242.                     if(st!=SAM_OK)
  243.                     {
  244.                             UART_Send_Str("SAM卡的3DES計(jì)算錯(cuò)誤:");
  245.                                 UART_Put_Num(g_cReceBuf,2);   //顯示錯(cuò)誤代碼
  246.                                 UART_Send_Enter();                                                                              
  247.                                 CLRBuff();
  248.                                 Request_loop();                                                                       
  249.                             continue;
  250.                     }

  251.                         UART_Send_Str("外部認(rèn)證的加密結(jié)果:");
  252.                         UART_Put_Num(g_cReceBuf,8);        
  253.                         memcpy(Temporary_Key, g_cReceBuf, 8);          //臨時(shí)保存加密結(jié)果
  254.                         UART_Send_Enter();

  255.                         CLRBuff();
  256.                         st=FM1208_External_Authenticate(DF_ExKey_Flag,Temporary_Key,g_cReceBuf);
  257.                         if(st!=0x9000)
  258.                         {        
  259.                                 if(st!=ST_ERR)
  260.                                 {
  261.                                         UART_Send_Str("終端POS機(jī)非法,外部認(rèn)證錯(cuò)誤:");
  262.                                         UART_Put_Num(g_cReceBuf,2);
  263.                                         UART_Send_Enter();
  264.                                 }
  265.                                 CLRBuff();
  266.                                 Request_loop();                                                                       
  267.                             continue;
  268.                         }

  269.                         UART_Send_Str("外部認(rèn)證成功,終端POS機(jī)合法!");
  270.                         UART_Send_Enter();
  271.                         UART_Send_Enter();

  272.                           
  273.                         ////////////////////////////////////////////////////////////////////



  274.                         
  275.                         //////////////////////////////////////////////////////////////
  276.                         //主要用于終端判斷卡的合法性,也就是說(shuō)你這張用戶卡是否能在我的終端上使用
  277.                     st=Get_challenge(Challenge_Num, 8);                       //從SAM卡里取一組隨機(jī)數(shù)//   
  278.                     if(st!=SAM_OK)                                                                 
  279.                     {
  280.                             UART_Send_Str("SAM卡讀取隨機(jī)碼錯(cuò)誤:");
  281.                                 UART_Put_Num(g_cReceBuf,2);   //顯示錯(cuò)誤代碼
  282.                                 UART_Send_Enter();                                                                              
  283.                                 CLRBuff();
  284.                                 Request_loop();                                                                       
  285.                             continue;               
  286.                     }
  287.         

  288.                         CLRBuff();
  289.                         st=FM1208_Inital_Authenticate(DF_Inital_Key_Flag, 8, Challenge_Num,g_cReceBuf); //用戶卡內(nèi)部認(rèn)證,加密該隨機(jī)數(shù)//
  290.                     if(st!=0x9000)                                                                 
  291.                     {
  292.                             UART_Send_Str("內(nèi)部認(rèn)證錯(cuò)誤:");
  293.                                 UART_Put_Num(g_cReceBuf,2);   //顯示錯(cuò)誤代碼
  294.                                 UART_Send_Enter();                                                                              
  295.                                 CLRBuff();
  296.                                 Request_loop();                                                                       
  297.                             continue;               
  298.                     }
  299.                         memcpy(Temporary_Key, g_cReceBuf, 8);          //臨時(shí)保存加密結(jié)果
  300.                   
  301.                         CLRBuff();
  302.                         st=Init_for_descrypt(Serial_Num, 0x8, 0x2C, DF_Inital_Key_Flag, g_cReceBuf);     //用3DE初始化 1級(jí)分散產(chǎn)生過(guò)程密鑰    2C--密鑰用途,為解密密鑰  
  303.                     if(st!=SAM_OK)                                                                 
  304.                     {
  305.                             UART_Send_Str("SAM卡的3DES初始化失敗:");
  306.                                 UART_Put_Num(g_cReceBuf,2);   //顯示錯(cuò)誤代碼
  307.                                 UART_Send_Enter();                                                                              
  308.                                 CLRBuff();
  309.                                 Request_loop();                                                                       
  310.                             continue;               
  311.                     }
  312.                         CLRBuff();
  313.                         st=Descrypt(Temporary_Key, 0x8, 0, g_cReceBuf, 0x8 );           //3DES算法 對(duì)剛才臨時(shí)保存的加密了的數(shù)據(jù)進(jìn)行解密//
  314.                     if(st!=SAM_OK)
  315.                     {
  316.                             UART_Send_Str("SAM卡的3DES計(jì)算錯(cuò)誤:");
  317.                                 UART_Put_Num(g_cReceBuf,2);   //顯示錯(cuò)誤代碼
  318.                                 UART_Send_Enter();                                                                              
  319.                                 CLRBuff();
  320.                                 Request_loop();                                                                       
  321.                             continue;
  322.                     }

  323.                         UART_Send_Str("內(nèi)部認(rèn)證的解密結(jié)果:");
  324.                         UART_Put_Num(g_cReceBuf,8);        
  325.                         UART_Send_Enter();


  326.                         for(i=0;i<8;i++)
  327.                         {
  328.                                 if(g_cReceBuf[i]!=Challenge_Num[i])                //這里判斷卡的合法性//
  329.                                 {
  330.                                            status=1;
  331.                                         break;                                
  332.                                 }
  333.                         }
  334.                         if(status==1)
  335.                         {
  336.                                 status=0;
  337.                                   UART_Send_Str("非法卡!不能在本終端使用!");
  338.                                   UART_Send_Enter();
  339.                                 CLRBuff();
  340.                                 Request_loop();                 
  341.                                 continue;
  342.                         }
  343.                     UART_Send_Str("內(nèi)部認(rèn)證成功,用戶卡合法!");
  344.                     UART_Send_Enter();
  345.                         UART_Send_Enter();
  346.                
  347.                         ////////////////////////////////////////////////////////////////////                          

  348.                           
  349.                         CLRBuff();                                                   
  350.                         st=FM1208_Read_Binary(FM1208_DF_0016_Flag[1],g_cReceBuf, 0x27 );                  //讀取0016文件持卡人基本信息
  351.                         if(st!=0x9000)
  352.                         {        
  353.                                 if(st!=ST_ERR)
  354.                                 {
  355.                                         UART_Send_Str("持卡人基本信息文件讀取失敗:");
  356.                                         UART_Put_Num(g_cReceBuf,2);
  357.                                         UART_Send_Enter();
  358.                                 }
  359.                                 CLRBuff();
  360.                                 Request_loop();                                                                       
  361.                             continue;
  362.                         }

  363.                         UART_Send_Str(">>持卡人基本信息文件讀取成功<<");
  364.                         UART_Send_Enter();
  365.                         UART_Send_Enter();

  366.                         UART_Send_Str("卡類型標(biāo)識(shí):");
  367.                         UART_Put_Num(&g_cReceBuf[0],1);
  368.                         UART_Send_Enter();

  369.                         UART_Send_Str("本行職工標(biāo)識(shí):");
  370.                         UART_Put_Num(&g_cReceBuf[1],1);
  371.                         UART_Send_Enter();

  372.                         UART_Send_Str("持 卡 人 的姓名:");
  373.                         UART_Send_Str(&g_cReceBuf[2]);
  374.                         NameToStr(&g_cReceBuf[2]);


  375.                         UART_Send_Enter();
  376.                         UART_Send_Enter();

  377.                         UART_Send_Str("持 卡 人 的證件類型:");
  378.                         UART_Put_Num(&g_cReceBuf[38],1);
  379.                         UART_Send_Enter();

  380.                         UART_Send_Str("持 卡 人 的證件號(hào)碼:");
  381.                         UART_Put_Num(&g_cReceBuf[22],16);
  382.                         UART_Send_Enter();




  383.         
  384.                         CLRBuff();
  385.                         DataBuf[0]=DPKey_Flag;                      //1個(gè)字節(jié)的消費(fèi)密鑰標(biāo)識(shí)                                       
  386.                         memcpy(&DataBuf[1], Purchase_Pay, 4); //4個(gè)字節(jié)的交易金額,即扣款金額        
  387.                         memcpy(&DataBuf[5], POSNum, 6);              //6個(gè)字節(jié)的終端機(jī)編號(hào)




  388.                     st=FM1208_Initalize_For_Purchase(EP, DataBuf,g_cReceBuf,tt); //消費(fèi)初始化操作//
  389.                         if(st!=0x9000)
  390.                         {        
  391.                                 if(st!=ST_ERR)
  392.                                 {
  393.                                         UART_Send_Str("初始化消費(fèi)錯(cuò)誤:");
  394.                                         UART_Put_Num(g_cReceBuf,tt[0]);          //當(dāng)返回9403時(shí),此時(shí)檢查一下你的用戶卡里面的消費(fèi)密鑰的標(biāo)識(shí)號(hào),是否對(duì)應(yīng)?
  395.                                         UART_Send_Enter();

  396.                                         if(st==0x9401)
  397.                                           DisNotMoney();         //卡余額不足
  398.                                         DelayMs(2000);
  399.                                         Dis_Deduct_Charge(0);
  400.                                 }
  401.                                 CLRBuff();
  402.                                 Request_loop();                                                                       
  403.                             continue;
  404.                         }
  405.                         
  406.                         UART_Send_Str(">>消費(fèi)初始化成功<<");
  407.                         UART_Send_Enter();
  408.                         UART_Send_Enter();
  409.                                                                  
  410.                         UART_Send_Str("電子錢包未消費(fèi)前的余額:");
  411.                         UART_Put_Num(g_cReceBuf,4);
  412.                         UART_Send_Enter();

  413.                         UART_Send_Str("電子錢 包 交 易序號(hào):");
  414.                         UART_Put_Num(&g_cReceBuf[4],2);
  415.                         UART_Send_Enter();

  416.                         UART_Send_Str(" 限 額:");
  417.                         UART_Put_Num(&g_cReceBuf[6],3);
  418.                         UART_Send_Enter();

  419.                         UART_Send_Str("密鑰版本號(hào):");         
  420.                         UART_Put_Num(&g_cReceBuf[9],1);
  421.                         UART_Send_Enter();

  422.                         UART_Send_Str("算法標(biāo)識(shí):");
  423.                         UART_Put_Num(&g_cReceBuf[10],1);
  424.                         UART_Send_Enter();

  425.                         UART_Send_Str("偽隨機(jī)碼:");
  426.                         UART_Put_Num(&g_cReceBuf[11],4);
  427.                         UART_Send_Enter();
  428.                         
  429.                         
  430.                         
  431.                         PAY=g_cReceBuf[2]<<8;                  
  432.                 PAY|=g_cReceBuf[3];         
  433.                     Dis_Money(NameLen,NameBuf,PAY);  //屏顯示消費(fèi)前的余額




  434.                
  435.                         memcpy(DataBuf, &g_cReceBuf[11], 4);          //拷偽隨機(jī)數(shù)
  436.                         memcpy(&DataBuf[4], &g_cReceBuf[4], 2);          //用戶卡交易序號(hào)
  437.                         memcpy(&DataBuf[6], Purchase_Pay, 4);          //交易金額
  438.                         DataBuf[10]=0x06;                                                  //交易類型
  439.                         memcpy(&DataBuf[11], DateTime, 7);              //交易日期時(shí)間
  440.                         DataBuf[18]=DPKey_Flag;                   //消費(fèi)密鑰版本標(biāo)識(shí)號(hào)
  441.                         DataBuf[19]=0x00;                         //算法標(biāo)識(shí),3DES

  442.                         memcpy(&DataBuf[20], Serial_Num, 8);          //用戶卡序號(hào)        
  443.                         memcpy(&DataBuf[28], S_KEY_2, 8);                   //分散因子2(為各成員銀行標(biāo)識(shí))         
  444.                         memcpy(&DataBuf[36], S_KEY_1, 8);                    //分散因子1(為各城市標(biāo)識(shí))


  445.         
  446.                         st=Init_SAM_For_Purchase(DataBuf, 0x2C,  g_cReceBuf); //MAC1計(jì)算初始化//
  447.                         if(st!=SAM_OK)
  448.                         {
  449.                                 UART_Send_Str("MAC1計(jì)算錯(cuò)誤:");       //當(dāng)返回9403時(shí),此時(shí)檢查一下你的SAM卡里面的消費(fèi)密鑰的版本標(biāo)識(shí)號(hào),是否對(duì)應(yīng)?
  450.                                 UART_Put_Num(g_cReceBuf,0x02);
  451.                                 UART_Send_Enter();
  452.                                 CLRBuff();
  453.                                 Request_loop();        
  454.                                 Dis_Deduct_Charge(0);                                                               
  455.                             continue;
  456.                         }
  457.                         
  458.                         UART_Send_Str(">>MAC1計(jì)算初始化成功<<");
  459.                         UART_Send_Enter();
  460.                         UART_Send_Enter();

  461.                         UART_Send_Str("終端交易序號(hào):");
  462.                         UART_Put_Num(g_cReceBuf,0x04);
  463.                         UART_Send_Enter();                  
  464.                         UART_Send_Str("返回的MAC1碼:");
  465.                         UART_Put_Num(&g_cReceBuf[4],0x04);                  
  466.                         UART_Send_Enter();
  467.                         

  468.                         memcpy(DataBuf, g_cReceBuf, 4);                  //拷終端交易序號(hào)        
  469.                         memcpy(&DataBuf[4], DateTime, 7);                  //拷交易日期時(shí)間
  470.                     memcpy(&DataBuf[11], &g_cReceBuf[4], 4); //拷MAC1  
  471.                

  472.                         st=FM1208_Debit_For_Capp_Purchase(DataBuf,g_cReceBuf,tt); //消費(fèi)命令//
  473.                         if(st!=0x9000)
  474.                         {
  475.                                 if(st!=ST_ERR)
  476.                                 {
  477.                                         UART_Send_Str("扣款失敗:");
  478.                                         UART_Put_Num(g_cReceBuf,tt[0]);         //當(dāng)返回9302時(shí),此時(shí)檢查一下你的密鑰因子是否正確,包括用戶卡序列號(hào),成員銀行及城市代碼,由于密鑰因子錯(cuò)了,分散出的過(guò)程密鑰也是錯(cuò)的,所以計(jì)算出的MAC也是錯(cuò)的
  479.                                         UART_Send_Enter();
  480.                                         DisCardfail();               
  481.                                 }
  482.                                 CLRBuff();
  483.                                 Request_loop();        
  484.                                 Dis_Deduct_Charge(0);                                                               
  485.                             continue;
  486.                         }


  487.                  
  488.                                 
  489.                         UART_Send_Str("用戶卡返回的交易驗(yàn)證TAC:");
  490.                         UART_Put_Num(g_cReceBuf,4);        
  491.                         UART_Send_Enter();         
  492.                         UART_Send_Str("用戶卡返回的MAC1:");
  493.                         UART_Put_Num(&g_cReceBuf[4],4);                  
  494.                         UART_Send_Enter();
  495.                         
  496.                         memcpy(DataBuf, &g_cReceBuf[4], 4);                  //拷MAC2,然后發(fā)送給PSAM卡進(jìn)行校驗(yàn)

  497.                     st=Credit_SAM_For_Purchase(DataBuf, g_cReceBuf);   //MAC2校驗(yàn)//
  498.                         if(st!=SAM_OK)
  499.                         {
  500.                            
  501.                                 UART_Send_Str("校驗(yàn)MAC2錯(cuò)誤:");
  502.                                 UART_Put_Num(g_cReceBuf,2);   //顯示錯(cuò)誤代碼
  503.                                 UART_Send_Enter();
  504.                                 DisCardfail();
  505.                                 CLRBuff();
  506.                                 Request_loop();        
  507.                                 Dis_Deduct_Charge(0);                                                               
  508.                             continue;
  509.                         }
  510.                         

  511.                         UART_Send_Str("扣款MAC2校驗(yàn)成功!");           
  512.                         UART_Send_Enter();
  513.                         UART_Send_Enter();

  514.                         st=FM1208_ReadNomey(EP ,g_cReceBuf);         //讀充值后的余額//
  515. ……………………

  516. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
CPU卡定額消費(fèi)帶PSAM卡操作并顯示屏顯示.zip (222.9 KB, 下載次數(shù): 262)


回復(fù)

使用道具 舉報(bào)

ID:299924 發(fā)表于 2018-12-22 15:35 | 顯示全部樓層
好的,看看 學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:395912 發(fā)表于 2018-12-30 15:38 | 顯示全部樓層
正找CPU卡的資料來(lái)看看
回復(fù)

使用道具 舉報(bào)

ID:68832 發(fā)表于 2019-1-29 16:14 | 顯示全部樓層
非常感謝!我一直尋找這個(gè)代碼,終于找到了,謝謝樓主的無(wú)私奉獻(xiàn)!666
回復(fù)

使用道具 舉報(bào)

ID:439078 發(fā)表于 2019-4-22 18:31 | 顯示全部樓層
已下載,內(nèi)容很好
回復(fù)

使用道具 舉報(bào)

ID:473471 發(fā)表于 2019-7-2 22:38 | 顯示全部樓層
好資料謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:297113 發(fā)表于 2019-7-11 10:39 | 顯示全部樓層
謝謝,非常感謝
回復(fù)

使用道具 舉報(bào)

ID:589817 發(fā)表于 2019-7-24 16:26 | 顯示全部樓層
非常好的資料,謝謝
回復(fù)

使用道具 舉報(bào)

ID:587835 發(fā)表于 2019-8-1 19:27 | 顯示全部樓層
感謝大神分享
回復(fù)

使用道具 舉報(bào)

ID:114581 發(fā)表于 2019-8-17 12:00 | 顯示全部樓層
fm1208白卡,rats,無(wú)回復(fù)?
回復(fù)

使用道具 舉報(bào)

ID:244813 發(fā)表于 2019-8-25 19:18 | 顯示全部樓層
感謝分享,看下內(nèi)容。
回復(fù)

使用道具 舉報(bào)

ID:605606 發(fā)表于 2019-8-30 17:41 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:369226 發(fā)表于 2019-9-26 09:36 | 顯示全部樓層
感謝樓主分享!學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:389751 發(fā)表于 2019-10-15 16:59 | 顯示全部樓層
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:106942 發(fā)表于 2019-11-24 15:16 | 顯示全部樓層
感謝樓主分享!學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:686839 發(fā)表于 2020-2-19 18:20 | 顯示全部樓層
不錯(cuò)的代碼分享
回復(fù)

使用道具 舉報(bào)

ID:391790 發(fā)表于 2025-1-15 20:00 | 顯示全部樓層
感謝樓主分享,學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表