JXLoginServer.m 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  1. //
  2. // JXLoginServer.m
  3. // shiku_im
  4. //
  5. // Created by p on 2019/7/23.
  6. // Copyright © 2019 Reese. All rights reserved.
  7. //
  8. #import "JXLoginServer.h"
  9. #import "MD5Util.h"
  10. #import "AESUtil.h"
  11. #import "NSMutableDictionary+NSMutableDictionary_SK.h"
  12. #import "JXKeyChainStore.h"
  13. #import "JXUUIDModel.h"
  14. @interface JXLoginServer()
  15. @property (nonatomic, weak) id toView;
  16. @property (nonatomic, copy) NSString *memberAccount;// 会员账号
  17. @property (nonatomic, copy) NSString *password; // 手动登录登录密码
  18. @property (nonatomic, copy) NSString *areaCode; // 区号
  19. @property (nonatomic, copy) NSString *account; // 手机号
  20. @property (nonatomic, copy) NSString *userId; // 用户ID
  21. @property (nonatomic, copy) NSString *model; // 手机号
  22. @property (nonatomic, copy) NSString *security; // 用户ID
  23. @property (nonatomic, copy) NSString *code; // 用户code
  24. @property (nonatomic, strong) NSData *codeData; // code解码后data
  25. @property (nonatomic, copy) NSString *salt; // 毫秒级时间
  26. @property (nonatomic, strong) NSMutableDictionary *param; // 接口参数
  27. @property (nonatomic,copy) NSString *loginToken; //登录返回的token用于自动登录验参
  28. @property (nonatomic,copy) NSString *loginKey; // 登录返回的key用于自动登录验参
  29. @property (nonatomic,copy) NSString *verificationCode; // 短信登录验证码
  30. @property (nonatomic, assign) BOOL isThird;
  31. @end
  32. @implementation JXLoginServer
  33. + (instancetype)sharedManager {
  34. static dispatch_once_t onceToken;
  35. static JXLoginServer *instance;
  36. dispatch_once(&onceToken, ^{
  37. instance = [[JXLoginServer alloc] init];
  38. });
  39. return instance;
  40. }
  41. - (instancetype)init {
  42. if ([super init]) {
  43. }
  44. return self;
  45. }
  46. // 登录接口方法
  47. - (void)loginWithUser:(JXUserObject *)user password:(NSString *)password areaCode:(NSString *)areaCode account:(NSString *)account toView:(id)toView{
  48. self.isThird = NO;
  49. long time = (long)[[NSDate date] timeIntervalSince1970];
  50. time = time *1000 + g_server.timeDifference;
  51. self.salt = [NSString stringWithFormat:@"%ld",time];
  52. self.toView = toView;
  53. self.password = password;
  54. self.areaCode = areaCode;
  55. self.account = account;
  56. self.param = [self getLoginParamWithUser:user];
  57. NSString *mac = [self getCodeMac];
  58. [g_server authGetLoginCodeWithAreaCode:areaCode account:account salt:self.salt deviceId:@"ios" mac:mac toView:self];
  59. }
  60. - (void)loginWithUserNew:(JXUserObject *)user password:(NSString *)password areaCode:(NSString *)areaCode account:(NSString *)account model:(NSString *)model security:(NSString *)securityStr toView:(id)toView{
  61. self.isThird = NO;
  62. long time = (long)[[NSDate date] timeIntervalSince1970];
  63. time = time *1000 + g_server.timeDifference;
  64. self.salt = [NSString stringWithFormat:@"%ld",time];
  65. self.toView = toView;
  66. self.password = password;
  67. self.areaCode = areaCode;
  68. self.account = account;
  69. self.model = model;
  70. self.security = securityStr;
  71. _param = [self getLoginParamWithUser:user];
  72. NSString *mac = [self getCodeMac];
  73. [g_server authGetLoginCodeWithAreaCodeXX:areaCode account:account salt:self.salt deviceId:@"ios" model:model security:securityStr mac:mac toView:self];
  74. }
  75. // 自动登录
  76. - (void)autoLoginWithToView:(id)toView {
  77. long time = (long)[[NSDate date] timeIntervalSince1970];
  78. time = time *1000 + g_server.timeDifference;
  79. self.salt = [NSString stringWithFormat:@"%ld",time];
  80. self.toView = toView;
  81. self.param = [self getAutoLoginParam];
  82. self.loginToken = [g_default objectForKey:kMY_USER_LOGINTOKEN];
  83. if (!self.loginToken) {
  84. self.loginToken = @"";
  85. }
  86. self.loginKey = [g_default objectForKey:kMY_USER_LOGINKEY];
  87. if (!self.loginKey) {
  88. self.loginKey = @"";
  89. }
  90. self.userId = MY_USER_ID;
  91. NSString *data = [self getDataString:YES];
  92. [g_server autoLoginV1:self.loginToken salt:self.salt data:data toView:self];
  93. }
  94. // 手动登录参数
  95. - (NSMutableDictionary *)getLoginParamWithUser:(JXUserObject *)user {
  96. NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];
  97. NSMutableDictionary *dict = [NSMutableDictionary dictionary];
  98. if (user.verificationCode) {
  99. [dict setObject:user.verificationCode forKey:@"verificationCode"];
  100. }
  101. [dict setObject:@"client_credentials" forKey:@"grant_type"];
  102. if (user.model) {
  103. [dict setObject:user.model forKey:@"model"];
  104. }
  105. if (user.osVersion) {
  106. [dict setObject:user.osVersion forKey:@"osVersion"];
  107. }
  108. if (user.security) {
  109. [dict setObject:user.security forKey:@"security"];
  110. }
  111. //[JXUUIDModel getDeviceIDInKeychain]
  112. [dict setObject:[JXKeyChainStore getUUIDByKeyChain] forKey:@"serial"];
  113. [dict setObject:[NSNumber numberWithDouble:g_server.latitude] forKey:@"latitude"];
  114. [dict setObject:[NSNumber numberWithDouble:g_server.longitude] forKey:@"longitude"];
  115. if (user.location) {
  116. [dict setObject:user.location forKey:@"location"];
  117. }
  118. [dict setObject:identifier forKey:@"appId"];
  119. [dict setObject:[NSNumber numberWithInt:1] forKey:@"xmppVersion"];
  120. // 登录类型 0:账号密码登录,1:短信验证码登录
  121. if (user.verificationCode.length > 0) {
  122. [dict setObject:@1 forKey:@"loginType"];
  123. }else {
  124. [dict setObject:@0 forKey:@"loginType"];
  125. }
  126. // 是否开启集群
  127. if ([g_config.isOpenCluster integerValue] == 1) {
  128. NSString *area = [g_default objectForKey:kLocationArea];
  129. if (area) {
  130. [dict setObject:area forKey:@"area"];
  131. }
  132. }
  133. return dict;
  134. }
  135. // 自动登录参数
  136. - (NSMutableDictionary *)getAutoLoginParam{
  137. NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];
  138. NSMutableDictionary *dict = [NSMutableDictionary dictionary];
  139. [dict setObject:g_macAddress forKey:@"serial"];
  140. [dict setObject:[NSNumber numberWithDouble:g_server.latitude] forKey:@"latitude"];
  141. [dict setObject:[NSNumber numberWithDouble:g_server.longitude] forKey:@"longitude"];
  142. [dict setObject:[NSNumber numberWithInt:1] forKey:@"xmppVersion"];
  143. [dict setObject:identifier forKey:@"appId"];
  144. // 是否开启集群
  145. if ([g_config.isOpenCluster integerValue] == 1) {
  146. NSString *area = [g_default objectForKey:kLocationArea];
  147. if (area) {
  148. [dict setObject:area forKey:@"area"];
  149. }
  150. }
  151. return dict;
  152. }
  153. - (NSString *)getCodeMac{
  154. NSMutableString *macStr = [NSMutableString string];
  155. [macStr appendString:APIKEY];
  156. //[macStr appendString:self.areaCode];
  157. [macStr appendString:@"86"];
  158. [macStr appendString:self.account];
  159. [macStr appendString:self.salt];
  160. NSData *aesData = [AESUtil encryptAESData:[MD5Util getMD5DataWithString:self.password] key:[MD5Util getMD5DataWithString:self.password]];
  161. NSData *macData = [g_securityUtil getHMACMD5:[macStr dataUsingEncoding:NSUTF8StringEncoding] key:[[MD5Util getMD5StringWithData:aesData] dataUsingEncoding:NSUTF8StringEncoding]];
  162. NSString *mac = [macData base64EncodedStringWithOptions:0];
  163. return mac;
  164. }
  165. - (NSString *)getLoginMac:(BOOL)isAutoLogin {
  166. NSMutableString *macStr = [NSMutableString string];
  167. [macStr appendString:APIKEY];
  168. [macStr appendString:self.userId];
  169. if (isAutoLogin) {
  170. [macStr appendString:self.loginToken];
  171. }
  172. NSString *paramStr = [self getParamStr];
  173. [macStr appendString:paramStr];
  174. [macStr appendString:self.salt];
  175. NSData *macData;
  176. if (!isAutoLogin) {
  177. NSData *aesData = [AESUtil encryptAESData:[MD5Util getMD5DataWithString:self.password] key:[MD5Util getMD5DataWithString:self.password]];
  178. [macStr appendString:[MD5Util getMD5StringWithData:aesData]];
  179. macData = [g_securityUtil getHMACMD5:[macStr dataUsingEncoding:NSUTF8StringEncoding] key:self.codeData];
  180. }else {
  181. NSData *keyData = [[NSData alloc] initWithBase64EncodedString:self.loginKey options:NSDataBase64DecodingIgnoreUnknownCharacters];
  182. macData = [g_securityUtil getHMACMD5:[macStr dataUsingEncoding:NSUTF8StringEncoding] key:keyData];
  183. }
  184. NSString *mac = [macData base64EncodedStringWithOptions:0];
  185. return mac;
  186. }
  187. // 参数按顺序拼接
  188. - (NSString *)getParamStr {
  189. NSMutableString *paramStr = [NSMutableString string];
  190. NSArray *keys = [[self.param allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
  191. for (NSInteger i = 0; i < keys.count; i ++) {
  192. NSString *key = keys[i];
  193. NSString *value = self.param[key];
  194. if ([self.param[key] isKindOfClass:[NSNumber class]]) {
  195. NSNumber *num = self.param[key];
  196. value = [num stringValue];
  197. }
  198. [paramStr appendString:value];
  199. [self.param setObject:value forKey:key];
  200. }
  201. return [paramStr copy];
  202. }
  203. - (NSString *)getDataString:(BOOL)isAutoLogin {
  204. NSString *mac = [self getLoginMac:isAutoLogin];
  205. NSMutableDictionary *dict = [self.param mutableCopy];
  206. [dict setObject:mac forKey:@"mac"];
  207. SBJsonWriter * OderJsonwriter = [SBJsonWriter new];
  208. NSString * jsonString = [OderJsonwriter stringWithObject:dict];
  209. NSData *aesJsonData;
  210. if (isAutoLogin) {
  211. NSData *data = [[NSData alloc] initWithBase64EncodedString:self.loginKey options:NSDataBase64DecodingIgnoreUnknownCharacters];
  212. aesJsonData = [AESUtil encryptAESData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] key:data];
  213. }else {
  214. aesJsonData = [AESUtil encryptAESData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] key:self.codeData];
  215. }
  216. return [aesJsonData base64EncodedStringWithOptions:0];
  217. }
  218. #pragma mark ----- 短信登录
  219. // 短信登录接口
  220. - (void)smsLoginWithUser:(JXUserObject *)user areaCode:(NSString *)areaCode account:(NSString *)account toView:(id)toView {
  221. long time = (long)[[NSDate date] timeIntervalSince1970];
  222. time = time *1000 + g_server.timeDifference;
  223. self.salt = [NSString stringWithFormat:@"%ld",time];
  224. self.toView = toView;
  225. self.areaCode = areaCode;
  226. self.account = account;
  227. self.verificationCode = user.verificationCode;
  228. self.param = [self getLoginParamWithUser:user];
  229. NSString *data = [self getSMSDataStr];
  230. [g_server userSMSLogin:self.areaCode account:self.account salt:self.salt data:data toView:self];
  231. }
  232. // 获取短信登录data
  233. - (NSString *)getSMSDataStr {
  234. NSString *mac = [self getSMSMac];
  235. NSMutableDictionary *dict = [self.param mutableCopy];
  236. [dict setObject:mac forKey:@"mac"];
  237. SBJsonWriter * OderJsonwriter = [SBJsonWriter new];
  238. NSString * jsonString = [OderJsonwriter stringWithObject:dict];
  239. NSData *aesJsonData = [AESUtil encryptAESData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] key:[MD5Util getMD5DataWithString:self.verificationCode]];
  240. return [aesJsonData base64EncodedStringWithOptions:0];
  241. }
  242. // 获取短信登录Mac
  243. - (NSString *)getSMSMac{
  244. NSMutableString *macStr = [NSMutableString string];
  245. [macStr appendString:APIKEY];
  246. [macStr appendString:self.areaCode];
  247. [macStr appendString:self.account];
  248. NSString *paramStr = [self getParamStr];
  249. [macStr appendString:paramStr];
  250. [macStr appendString:self.salt];
  251. NSData *macData = [g_securityUtil getHMACMD5:[macStr dataUsingEncoding:NSUTF8StringEncoding] key:[MD5Util getMD5DataWithString:self.verificationCode]];
  252. NSString *mac = [macData base64EncodedStringWithOptions:0];
  253. return mac;
  254. }
  255. #pragma mark ----- 第三方绑定
  256. // 第三方绑定手机号
  257. -(void)thirdLoginV1:(JXUserObject*)user password:(NSString *)password type:(NSInteger)type openId:(NSString *)openId isLogin:(BOOL)isLogin toView:(id)toView {
  258. self.isThird = YES;
  259. long time = (long)[[NSDate date] timeIntervalSince1970];
  260. time = time *1000 + g_server.timeDifference;
  261. self.salt = [NSString stringWithFormat:@"%ld",time];
  262. self.password = password;
  263. self.toView = toView;
  264. self.param = [self getThirdLoginParamWithUser:user type:type openId:openId isLogin:isLogin];
  265. self.areaCode = user.areaCode;
  266. self.account = user.telephone;
  267. NSString *mac = [self getCodeMac];
  268. [g_server authGetLoginCodeWithAreaCode:self.areaCode account:self.account salt:self.salt deviceId:@"ios" mac:mac toView:self];
  269. }
  270. // 第三方绑定参数
  271. - (NSMutableDictionary *)getThirdLoginParamWithUser:(JXUserObject *)user type:(NSInteger)type openId:(NSString *)openId isLogin:(BOOL)isLogin {
  272. NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];
  273. NSMutableDictionary *p = [NSMutableDictionary dictionary];
  274. [p setNotNullObject:[NSNumber numberWithInteger:type] forKey:@"type"];
  275. [p setNotNullObject:openId forKey:@"loginInfo"];
  276. if (g_server.openId.length > 0 ) {
  277. NSString *tel = [NSString stringWithFormat:@"%@%@",user.areaCode,user.telephone];
  278. [p setNotNullObject:tel forKey:@"telephone"];
  279. }else {
  280. [p setNotNullObject:user.telephone forKey:@"telephone"];
  281. }
  282. NSData *aesData = [AESUtil encryptAESData:[MD5Util getMD5DataWithString:self.password] key:[MD5Util getMD5DataWithString:self.password]];
  283. [p setObject:[MD5Util getMD5StringWithData:aesData]forKey:@"password"];
  284. // 没有在登录后 绑定 才需要传下面的参数
  285. if (!isLogin) {
  286. [p setNotNullObject:user.areaCode forKey:@"areaCode"];
  287. [p setNotNullObject:@"client_credentials" forKey:@"grant_type"];
  288. [p setNotNullObject:user.model forKey:@"model"];
  289. [p setNotNullObject:user.osVersion forKey:@"osVersion"];
  290. [p setNotNullObject:g_macAddress forKey:@"serial"];
  291. [p setNotNullObject:[NSNumber numberWithDouble:g_server.latitude] forKey:@"latitude"];
  292. [p setNotNullObject:[NSNumber numberWithDouble:g_server.longitude] forKey:@"longitude"];
  293. [p setNotNullObject:user.location forKey:@"location"];
  294. [p setNotNullObject:identifier forKey:@"appId"];
  295. [p setNotNullObject:[NSNumber numberWithInt:1] forKey:@"xmppVersion"];
  296. [p setNotNullObject:[JXKeyChainStore getUUIDByKeyChain] forKey:@"serial"];
  297. // 是否开启集群
  298. if ([g_config.isOpenCluster integerValue] == 1) {
  299. NSString *area = [g_default objectForKey:kLocationArea];
  300. [p setNotNullObject:area forKey:@"area"];
  301. }
  302. }
  303. return p;
  304. }
  305. // 获取第三方绑定data
  306. - (NSString *)getThirdDataStr {
  307. NSString *mac = [self getThirdMac];
  308. NSMutableDictionary *dict = [self.param mutableCopy];
  309. [dict setObject:mac forKey:@"mac"];
  310. SBJsonWriter * OderJsonwriter = [SBJsonWriter new];
  311. NSString * jsonString = [OderJsonwriter stringWithObject:dict];
  312. NSData *aesJsonData = [AESUtil encryptAESData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] key:self.codeData];
  313. return [aesJsonData base64EncodedStringWithOptions:0];
  314. }
  315. // 获取第三方绑定Mac
  316. - (NSString *)getThirdMac{
  317. NSMutableString *macStr = [NSMutableString string];
  318. [macStr appendString:APIKEY];
  319. [macStr appendString:self.userId];
  320. NSString *paramStr = [self getParamStr];
  321. [macStr appendString:paramStr];
  322. [macStr appendString:self.salt];
  323. NSData *aesData = [AESUtil encryptAESData:[MD5Util getMD5DataWithString:self.password] key:[MD5Util getMD5DataWithString:self.password]];
  324. [macStr appendString:[MD5Util getMD5StringWithData:aesData]];
  325. NSData *macData = [g_securityUtil getHMACMD5:[macStr dataUsingEncoding:NSUTF8StringEncoding] key:self.codeData];
  326. NSString *mac = [macData base64EncodedStringWithOptions:0];
  327. return mac;
  328. }
  329. #pragma mark -------微信登录
  330. // 微信登录
  331. - (void)wxSdkLoginV1:(JXUserObject *)user type:(NSInteger)type openId:(NSString *)openId toView:(id)toView {
  332. long time = (long)[[NSDate date] timeIntervalSince1970];
  333. time = time *1000 + g_server.timeDifference;
  334. self.salt = [NSString stringWithFormat:@"%ld",time];
  335. self.toView = toView;
  336. self.account = openId;
  337. self.param = [self getWXSdkLoginParamWithUser:user type:type openId:openId];
  338. NSString *data = [self getWXSdkLoginDataStr];
  339. [g_server wxSdkLoginV1:self.salt data:data toView:self];
  340. }
  341. // 微信登录参数
  342. - (NSMutableDictionary *)getWXSdkLoginParamWithUser:(JXUserObject *)user type:(NSInteger)type openId:(NSString *)openId{
  343. NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];
  344. NSMutableDictionary *p = [NSMutableDictionary dictionary];
  345. [p setNotNullObject:[NSNumber numberWithInteger:type] forKey:@"type"];
  346. [p setNotNullObject:openId forKey:@"loginInfo"];
  347. // [p setNotNullObject:user forKey:@"UserExample"];
  348. [p setNotNullObject:user.areaCode forKey:@"areaCode"];
  349. [p setNotNullObject:user.verificationCode forKey:@"verificationCode"];
  350. [p setNotNullObject:@"client_credentials" forKey:@"grant_type"];
  351. [p setNotNullObject:user.model forKey:@"model"];
  352. [p setNotNullObject:user.osVersion forKey:@"osVersion"];
  353. [p setNotNullObject:g_macAddress forKey:@"serial"];
  354. [p setNotNullObject:[NSNumber numberWithDouble:g_server.latitude] forKey:@"latitude"];
  355. [p setNotNullObject:[NSNumber numberWithDouble:g_server.longitude] forKey:@"longitude"];
  356. [p setNotNullObject:user.location forKey:@"location"];
  357. [p setNotNullObject:identifier forKey:@"appId"];
  358. [p setNotNullObject:[NSNumber numberWithInt:1] forKey:@"xmppVersion"];
  359. [p setNotNullObject:[JXKeyChainStore getUUIDByKeyChain] forKey:@"serial"];
  360. // 是否开启集群
  361. if ([g_config.isOpenCluster integerValue] == 1) {
  362. NSString *area = [g_default objectForKey:kLocationArea];
  363. [p setNotNullObject:area forKey:@"area"];
  364. }
  365. return p;
  366. }
  367. // 获取微信登录data
  368. - (NSString *)getWXSdkLoginDataStr {
  369. NSString *mac = [self getWXSdkLogindMac];
  370. NSMutableDictionary *dict = [self.param mutableCopy];
  371. [dict setObject:mac forKey:@"mac"];
  372. SBJsonWriter * OderJsonwriter = [SBJsonWriter new];
  373. NSString * jsonString = [OderJsonwriter stringWithObject:dict];
  374. NSData *aesJsonData = [AESUtil encryptAESData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] key:[MD5Util getMD5DataWithString:APIKEY]];
  375. return [aesJsonData base64EncodedStringWithOptions:0];
  376. }
  377. // 获取微信登录Mac
  378. - (NSString *)getWXSdkLogindMac{
  379. NSMutableString *macStr = [NSMutableString string];
  380. [macStr appendString:APIKEY];
  381. NSString *paramStr = [self getParamStr];
  382. [macStr appendString:paramStr];
  383. [macStr appendString:self.salt];
  384. NSData *macData = [g_securityUtil getHMACMD5:[macStr dataUsingEncoding:NSUTF8StringEncoding] key:[MD5Util getMD5DataWithString:APIKEY]];
  385. NSString *mac = [macData base64EncodedStringWithOptions:0];
  386. return mac;
  387. }
  388. // 注册
  389. -(void)registerUserV1:(JXUserObject*)user type:(int)type inviteCode:(NSString *)inviteCode workexp:(int)workexp diploma:(int)diploma isSmsRegister:(BOOL)isSmsRegister smsCode:(NSString *)smsCode password:(NSString *)password memberAccount:(NSString *)memberAccount toView:(id)toView {
  390. long time = (long)[[NSDate date] timeIntervalSince1970];
  391. time = time *1000 + g_server.timeDifference;
  392. self.salt = [NSString stringWithFormat:@"%ld",time];
  393. self.password = password;
  394. self.toView = toView;
  395. self.memberAccount = memberAccount;
  396. self.param = [self getRegisterParamWithUser:user type:type inviteCode:inviteCode workexp:workexp diploma:diploma isSmsRegister:isSmsRegister smsCode:smsCode memberAccount:memberAccount];
  397. NSString *data = [self getRegisterDataStr];
  398. [g_server registerUser:self.salt data:data toView:self];
  399. }
  400. // 第三方注册参数
  401. - (NSMutableDictionary *)getRegisterParamWithUser:(JXUserObject *)user type:(int)type inviteCode:(NSString *)inviteCode workexp:(int)workexp diploma:(int)diploma isSmsRegister:(BOOL)isSmsRegister smsCode:(NSString *)smsCode memberAccount:(NSString *)memberAccount {
  402. NSMutableDictionary *p = [NSMutableDictionary dictionary];
  403. if (g_server.openId.length <= 0) {
  404. }else {
  405. [p setNotNullObject:[NSNumber numberWithInteger:type] forKey:@"type"];
  406. [p setNotNullObject:g_server.openId forKey:@"loginInfo"];
  407. }
  408. [p setNotNullObject:user.telephone forKey:@"telephone"];
  409. NSData *aesData = [AESUtil encryptAESData:[MD5Util getMD5DataWithString:self.password] key:[MD5Util getMD5DataWithString:self.password]];
  410. [p setNotNullObject:[MD5Util getMD5StringWithData:aesData] forKey:@"password"];
  411. [p setNotNullObject:user.areaCode forKey:@"areaCode"];
  412. [p setNotNullObject:user.userType forKey:@"userType"];
  413. [p setNotNullObject:user.userNickname forKey:@"nickname"];
  414. [p setNotNullObject:user.userDescription forKey:@"description"];
  415. [p setNotNullObject:[NSNumber numberWithLongLong:[user.birthday timeIntervalSince1970]] forKey:@"birthday"];
  416. [p setNotNullObject:user.sex forKey:@"sex"];
  417. [p setNotNullObject:user.companyId forKey:@"companyId"];
  418. [p setNotNullObject:user.countryId forKey:@"countryId"];
  419. [p setNotNullObject:user.provinceId forKey:@"provinceId"];
  420. if ([user.cityId integerValue] > 0) {
  421. [p setNotNullObject:user.cityId forKey:@"cityId"];
  422. }else {
  423. [p setNotNullObject:[NSNumber numberWithInt:g_server.cityId] forKey:@"cityId"];
  424. }
  425. [p setNotNullObject:user.areaId forKey:@"areaId"];
  426. [p setNotNullObject:user.model forKey:@"model"];
  427. [p setNotNullObject:user.osVersion forKey:@"osVersion"];
  428. [p setNotNullObject:user.serialNumber forKey:@"serialNumber"];
  429. [p setNotNullObject:user.latitude forKey:@"latitude"];
  430. [p setNotNullObject:user.longitude forKey:@"longitude"];
  431. [p setNotNullObject:user.location forKey:@"location"];
  432. [p setNotNullObject:[NSNumber numberWithInt:workexp] forKey:@"w"];
  433. [p setNotNullObject:[NSNumber numberWithInt:diploma] forKey:@"d"];
  434. [p setNotNullObject:[NSNumber numberWithInt:1] forKey:@"xmppVersion"];
  435. [p setNotNullObject:[NSNumber numberWithInt:(isSmsRegister ? 1 : 0)] forKey:@"isSmsRegister"];
  436. [p setNotNullObject:inviteCode forKey:@"inviteCode"];
  437. [p setNotNullObject:smsCode forKey:@"smsCode"];
  438. [p setNotNullObject:[JXKeyChainStore getUUIDByKeyChain] forKey:@"serial"];
  439. [p setNotNullObject:memberAccount forKey:@"membershipAccount"];
  440. #ifdef IS_MsgEncrypt
  441. // 上传消息加密的DH公私钥
  442. [g_msgUtil generatekeyPairsDH];
  443. NSData *dhPriData = [[NSData alloc] initWithBase64EncodedString:g_msgUtil.dhPrivateKey options:NSDataBase64DecodingIgnoreUnknownCharacters];
  444. NSData *dhPriAesData = [AESUtil encryptAESData:dhPriData key:[MD5Util getMD5DataWithString:self.password]];
  445. NSString *dhPriStr = [dhPriAesData base64EncodedStringWithOptions:0];
  446. [p setNotNullObject:dhPriStr forKey:@"dhPrivateKey"];
  447. [p setNotNullObject:g_msgUtil.dhPublicKey forKey:@"dhPublicKey"];
  448. // 上传群组消息加密的RSA公私钥
  449. [g_msgUtil generatekeyPairsRSA];
  450. NSData *rsaPriData = [[NSData alloc] initWithBase64EncodedString:g_msgUtil.rsaPrivateKey options:NSDataBase64DecodingIgnoreUnknownCharacters];
  451. NSData *rsaPriAesData = [AESUtil encryptAESData:rsaPriData key:[MD5Util getMD5DataWithString:self.password]];
  452. NSString *rsaPriStr = [rsaPriAesData base64EncodedStringWithOptions:0];
  453. [p setNotNullObject:rsaPriStr forKey:@"rsaPrivateKey"];
  454. [p setNotNullObject:g_msgUtil.rsaPublicKey forKey:@"rsaPublicKey"];
  455. #endif
  456. return p;
  457. }
  458. // 获取注册data
  459. - (NSString *)getRegisterDataStr {
  460. NSString *mac = [self getRegisterMac];
  461. NSMutableDictionary *dict = [self.param mutableCopy];
  462. [dict setObject:mac forKey:@"mac"];
  463. SBJsonWriter * OderJsonwriter = [SBJsonWriter new];
  464. NSString * jsonString = [OderJsonwriter stringWithObject:dict];
  465. NSData *aesJsonData = [AESUtil encryptAESData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] key:[MD5Util getMD5DataWithString:APIKEY]];
  466. return [aesJsonData base64EncodedStringWithOptions:0];
  467. }
  468. // 获取微信登录Mac
  469. - (NSString *)getRegisterMac{
  470. NSMutableString *macStr = [NSMutableString string];
  471. [macStr appendString:APIKEY];
  472. NSString *paramStr = [self getParamStr];
  473. [macStr appendString:paramStr];
  474. [macStr appendString:self.salt];
  475. NSData *macData = [g_securityUtil getHMACMD5:[macStr dataUsingEncoding:NSUTF8StringEncoding] key:[MD5Util getMD5DataWithString:APIKEY]];
  476. NSString *mac = [macData base64EncodedStringWithOptions:0];
  477. return mac;
  478. }
  479. #pragma mark - 服务器返回数据
  480. -(void) didServerResultSucces:(JXConnection*)aDownload dict:(NSDictionary*)dict array:(NSArray*)array1{
  481. if( [aDownload.action isEqualToString:act_AuthGetLoginCode] ){
  482. self.userId = dict[@"userId"];
  483. // 如果没有code 说明服务器上没有上传公私钥
  484. if (!dict[@"code"]) {
  485. // 获取私钥
  486. SecKeyRef privateKey = [g_securityUtil getRSAPrivateKey];
  487. SecKeyRef publicKey = [g_securityUtil getRSAPublicKeyWithPrivateKey:privateKey];
  488. // 获取通用公钥base64
  489. NSString *publicKeyStr = [g_securityUtil getKeyForJavaServer:[g_securityUtil getKeyBitsFromKey:publicKey]];
  490. // 获取私钥data
  491. NSData *privateKeyData = [g_securityUtil getKeyBitsFromKey:privateKey];
  492. // 私钥aes加密
  493. NSData *privateAesData = [AESUtil encryptAESData:privateKeyData key:[MD5Util getMD5DataWithString:self.password]];
  494. NSString *privateAes = [privateAesData base64EncodedStringWithOptions:0];
  495. // mac验签(拼接私钥+公钥)
  496. NSMutableString *macStr = [NSMutableString string];
  497. [macStr appendString:APIKEY];
  498. [macStr appendString:self.userId];
  499. [macStr appendString:privateAes];
  500. [macStr appendString:publicKeyStr];
  501. [macStr appendString:_salt];
  502. NSData *aesData = [AESUtil encryptAESData:[MD5Util getMD5DataWithString:self.password] key:[MD5Util getMD5DataWithString:self.password]];
  503. NSData *macData = [g_securityUtil getHMACMD5:[macStr dataUsingEncoding:NSUTF8StringEncoding] key:[[MD5Util getMD5StringWithData:aesData] dataUsingEncoding:NSUTF8StringEncoding]];
  504. NSString *mac = [macData base64EncodedStringWithOptions:0];
  505. // 上传公钥和私钥 -- Mac验签
  506. [g_server authkeysUploadLoginKeyWithUserId:self.userId salt:self.salt privateKey:privateAes publicKey:publicKeyStr mac:mac toView:self];
  507. }else { // 如果获取到code
  508. self.code = dict[@"code"];
  509. NSMutableString *macStr = [NSMutableString string];
  510. [macStr appendString:APIKEY];
  511. [macStr appendString:self.userId];
  512. [macStr appendString:self.salt];
  513. NSData *aesData = [AESUtil encryptAESData:[MD5Util getMD5DataWithString:self.password] key:[MD5Util getMD5DataWithString:self.password]];
  514. NSData *macData = [g_securityUtil getHMACMD5:[macStr dataUsingEncoding:NSUTF8StringEncoding] key:[[MD5Util getMD5StringWithData:aesData] dataUsingEncoding:NSUTF8StringEncoding]];
  515. NSString *mac = [macData base64EncodedStringWithOptions:0];
  516. // 去服务器获取已上传的私钥
  517. [g_server authkeysGetLoginPrivateKeyWithUserId:self.userId salt:self.salt mac:mac toView:self];
  518. }
  519. }
  520. if ([aDownload.action isEqualToString:act_AuthkeysUploadLoginKey]) {
  521. // 上传私钥公私钥成功后重新获取code
  522. NSString *mac = [self getCodeMac];
  523. [g_server authGetLoginCodeWithAreaCode:self.areaCode account:self.account salt:self.salt deviceId:@"ios" mac:mac toView:self];
  524. // [g_server transactionGetCodeWithSalt:salt mac:mac toView:self];
  525. }
  526. if ([aDownload.action isEqualToString:act_AuthkeysGetLoginPrivateKey]) {
  527. // 从服务器获取公私钥成功后调用支付通用接口
  528. NSString *privateAesStr = dict[@"privateKey"];
  529. NSData *privateAesData = [[NSData alloc] initWithBase64EncodedString:privateAesStr options:NSDataBase64DecodingIgnoreUnknownCharacters];
  530. NSData *privateData = [AESUtil decryptAESData:privateAesData key:[MD5Util getMD5DataWithString:self.password]];
  531. NSString *privateBase64 = [privateData base64EncodedStringWithOptions:0];
  532. SecKeyRef privateKey = [g_securityUtil getRSAKeyWithBase64Str:privateBase64 isPrivateKey:YES];
  533. NSData *codeData = [[NSData alloc] initWithBase64EncodedString:self.code options:NSDataBase64DecodingIgnoreUnknownCharacters];
  534. self.codeData = [g_securityUtil decryptMessageRSA:codeData withPrivateKey:privateKey];
  535. if (self.isThird) {
  536. NSString *data = [self getThirdDataStr];
  537. if (data) {
  538. [g_server thirdLoginV1:self.userId salt:self.salt data:data toView:self];
  539. }
  540. }else {
  541. NSString *data = [self getDataString:NO];
  542. if (data) {
  543. [g_server loginV1:self.userId salt:self.salt data:data model:_model secrity:_security toView:self];
  544. // [g_server loginV1:self.userId salt:self.salt data:data toView:self];
  545. }
  546. }
  547. }
  548. if ([aDownload.action isEqualToString:act_UserLoginV1] || [aDownload.action isEqualToString:act_thirdLoginV1]) {
  549. NSString *dataStr = [dict objectForKey:@"data"];
  550. NSData *data = [[NSData alloc] initWithBase64EncodedString:dataStr options:NSDataBase64DecodingIgnoreUnknownCharacters];
  551. NSData *jsonData = [AESUtil decryptAESData:data key:self.codeData];
  552. NSString *json = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
  553. SBJsonParser * resultParser = [[SBJsonParser alloc] init];
  554. NSDictionary *resultObject = [resultParser objectWithString:json];
  555. if( [self.toView respondsToSelector:@selector(didServerResultSucces:dict:array:)] )
  556. [self.toView didServerResultSucces:aDownload dict:resultObject array:nil];
  557. }
  558. if ([aDownload.action isEqualToString:act_userLoginAutoV1]) {
  559. NSString *dataStr = [dict objectForKey:@"data"];
  560. NSData *data = [[NSData alloc] initWithBase64EncodedString:dataStr options:NSDataBase64DecodingIgnoreUnknownCharacters];
  561. NSData *keyData = [[NSData alloc] initWithBase64EncodedString:self.loginKey options:NSDataBase64DecodingIgnoreUnknownCharacters];
  562. NSData *jsonData = [AESUtil decryptAESData:data key:keyData];
  563. NSString *json = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
  564. SBJsonParser * resultParser = [[SBJsonParser alloc] init];
  565. NSDictionary *resultObject = [resultParser objectWithString:json];
  566. if (!resultObject) {
  567. resultObject = [resultParser objectWithString:dataStr];
  568. }
  569. if( [self.toView respondsToSelector:@selector(didServerResultSucces:dict:array:)] )
  570. [self.toView didServerResultSucces:aDownload dict:resultObject array:nil];
  571. }
  572. if ([aDownload.action isEqualToString:act_UserSMSLogin]) {
  573. NSString *dataStr = [dict objectForKey:@"data"];
  574. NSData *data = [[NSData alloc] initWithBase64EncodedString:dataStr options:NSDataBase64DecodingIgnoreUnknownCharacters];
  575. NSData *jsonData = [AESUtil decryptAESData:data key:[MD5Util getMD5DataWithString:self.verificationCode]];
  576. NSString *json = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
  577. SBJsonParser * resultParser = [[SBJsonParser alloc] init];
  578. NSDictionary *resultObject = [resultParser objectWithString:json];
  579. if( [self.toView respondsToSelector:@selector(didServerResultSucces:dict:array:)] )
  580. [self.toView didServerResultSucces:aDownload dict:resultObject array:nil];
  581. }
  582. if ([aDownload.action isEqualToString:act_sdkLoginV1] || [aDownload.action isEqualToString:act_RegisterV1] || [aDownload.action isEqualToString:act_registerSDKV1]) {
  583. NSString *dataStr = [dict objectForKey:@"data"];
  584. NSData *data = [[NSData alloc] initWithBase64EncodedString:dataStr options:NSDataBase64DecodingIgnoreUnknownCharacters];
  585. NSData *jsonData = [AESUtil decryptAESData:data key:[MD5Util getMD5DataWithString:APIKEY]];
  586. NSString *json = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
  587. SBJsonParser * resultParser = [[SBJsonParser alloc] init];
  588. NSDictionary *resultObject = [resultParser objectWithString:json];
  589. if( [self.toView respondsToSelector:@selector(didServerResultSucces:dict:array:)] )
  590. [self.toView didServerResultSucces:aDownload dict:resultObject array:nil];
  591. #ifdef IS_MsgEncrypt
  592. // 保存私钥
  593. NSString *userId = [[dict objectForKey:@"userId"] stringValue];
  594. NSData *dhPriData = [[NSData alloc] initWithBase64EncodedString:g_msgUtil.dhPrivateKey options:NSDataBase64DecodingIgnoreUnknownCharacters];
  595. NSData *dhPriAesData = [AESUtil encryptAESData:dhPriData key:[userId dataUsingEncoding:NSUTF8StringEncoding]];
  596. NSString *dhPriStr = [dhPriAesData base64EncodedStringWithOptions:0];
  597. [g_default setObject:dhPriStr forKey:kMY_USER_PrivateKey_DH];
  598. NSData *rsaPriData = [[NSData alloc] initWithBase64EncodedString:g_msgUtil.rsaPrivateKey options:NSDataBase64DecodingIgnoreUnknownCharacters];
  599. NSData *rsaPriAesData = [AESUtil encryptAESData:rsaPriData key:[userId dataUsingEncoding:NSUTF8StringEncoding]];
  600. NSString *rsaPriStr = [rsaPriAesData base64EncodedStringWithOptions:0];
  601. [g_default setObject:rsaPriStr forKey:kMY_USER_PrivateKey_RSA];
  602. #endif
  603. }
  604. }
  605. -(int) didServerResultFailed:(JXConnection*)aDownload dict:(NSDictionary*)dict{
  606. if( [self.toView respondsToSelector:@selector(didServerResultFailed:dict:)] ) {
  607. [self.toView didServerResultFailed:aDownload dict:dict];
  608. }
  609. return show_error;
  610. }
  611. -(int) didServerConnectError:(JXConnection*)aDownload error:(NSError *)error{//error为空时,代表超时
  612. if ([self.toView respondsToSelector:@selector(didServerConnectError:error:)]) {
  613. [self.toView didServerConnectError:aDownload error:error];
  614. }
  615. return show_error;
  616. }
  617. -(void) didServerConnectStart:(JXConnection*)aDownload{
  618. if ([self.toView respondsToSelector:@selector(didServerConnectStart:)]) {
  619. [self.toView didServerConnectStart:aDownload];
  620. }
  621. }
  622. // 获取修改密码和忘记密码验签
  623. - (NSString *)getUpdatePWDMacWithValue:(NSString *)value password:(NSString *)password {
  624. NSData *encryptPWDData = [AESUtil encryptAESData:[MD5Util getMD5DataWithString:password] key:[MD5Util getMD5DataWithString:password]];
  625. NSString *encryptPWD = [MD5Util getMD5StringWithData:encryptPWDData];
  626. NSData *aesKey = [[NSData alloc] initWithBase64EncodedString:encryptPWD options:NSDataBase64DecodingIgnoreUnknownCharacters];
  627. NSData *macValue = [AESUtil encryptAESData:[APIKEY dataUsingEncoding:NSUTF8StringEncoding] key:aesKey];
  628. NSData *macData = [g_securityUtil getHMACMD5:macValue key:[value dataUsingEncoding:NSUTF8StringEncoding]];
  629. NSString *mac = [macData base64EncodedStringWithOptions:0];
  630. return mac;
  631. }
  632. @end