ObjC-PZ8583是基于BerTlv和Oscar-ISO8583的基础上进行的iOS封装,底层8583的打包和拆包使用了C语言的Oscar-ISO8583版本,为了适应开发需求,进行了Objective-C的封装,使得使用起来更方便一些,目前在国内这方面的资源还是非常罕见的,在对该代码开源的过程中,我进行了一些删减的工作,主要是一些非银联常见做法的接口,所以大家还是先了解自己的需求,进行一些微调之后再使用。
在开发过程中得益于开源的贡献,大大的帮助了我的开发,这几年在支付领域的开发经验,使我对这方面可能更熟悉一点,所以拿出来晒一晒,如果对你有帮助,欢迎收藏,如有一些好的意见,欢迎加我QQ:504299929讨论。
比如签到交易,大家可以在PZTransService中看到
- (void)mposGetWorkKeyFromServerWithBlock:(void(^)(NSString *text))display {
display(@"----------------签到-------------");
// NSString *lmk = @"a2dff4e59289a82fc740f4f4e5d997e6";
NSString *lmk = self.masterKey;
BOOL ret =[self.sockMgr startStop];
if (ret ) {
PZSignInRequest *request = [PZSignInRequest new];
[request.posFields setTranTtc:self.transTtc];
[request.posFields setTerminalId:self.terminalId];
[request.posFields setMerchantId:self.merchantId];
PZPrivateField60 *field60 = [PZPrivateField60 new];
field60.msgType = kSignInField60MsgType;
field60.batchNumber = self.batchNumber;
field60.networkCode = kSignInField60Network;
[request.posFields setPrivate60:[field60 encode]];
[request setOprNumber:@"01 "];
NSData *data = [request encode];
NSLog(@"send:%@",data);
display(request.posFields.description);
__block NSData *recvData = nil;
[self.sockMgr sendDataToServer:data finishCallBack:^(NSData *pospData,NSError *error){
if (!error) {
recvData = [pospData subdataWithRange:NSMakeRange(2, pospData.length -2)];
PZSignInResponse *signResp = [PZSignInResponse new];
[signResp decode:recvData];
display(signResp.posFields.description);
if ([signResp.respCode isEqualToString:kResponseCodeSuccess00]) {
NSLog(@"%@",[signResp.private62 description]);
PZPrivateField62 *field62 = signResp.private62;
NSString *pinKey = [NSString decrypt3Des:field62.pinKey withKey:lmk];
NSString *macKey = [NSString decrypt3Des:field62.macKey withKey:lmk];
NSString *trkKey = [NSString decrypt3Des:field62.trkKey withKey:lmk];
NSString *pinCheck = [NSString encrypt3Des:@"0000000000000000" withKey:pinKey];
NSString *macCheck = [NSString encrypt3Des:@"0000000000000000" withKey:macKey];
NSString *trkCheck = [NSString encrypt3Des:@"0000000000000000" withKey:trkKey];
NSLog(@"pinkey:%@,check:%@;macKey:%@,check:%@;trkKey:%@,check:%@",pinKey,pinCheck,macKey,macCheck,trkKey,trkCheck);
NSString *log = [NSString stringWithFormat:@"%@\npinkey:%@,check:%@;macKey:%@,check:%@;trkKey:%@,check:%@",[signResp.private62 description],pinKey,pinCheck,macKey,macCheck,trkKey,trkCheck];
display(log);
self.pinKey = pinKey;
self.macKey = macKey;
self.trkKey = trkKey;
} else {
NSLog(@"response:%@",signResp.respCode);
}
}
[self.sockMgr didDisconnected];
}];
}
}
近日有不少人来问,35域问题,有些35域不是加密处理的,如果遇到该问题,请找到下面代码
static DL_ISO8583_TYPE fieldTypeArr[] = {
/* ISO_N */ {_unpack_iso_ASCHEX,_pack_iso_ASCHEX},
/* ISO_NS */ {_unpack_iso_BINARY,_pack_iso_BINARY},
/* ISO_XN */ {_unpack_iso_ASCHEX,_pack_iso_ASCHEX},
/* ISO_A */ {_unpack_iso_ASCII ,_pack_iso_ASCII },
/* ISO_AN */ {_unpack_iso_ASCII ,_pack_iso_ASCII },
/* ISO_ANS */ {_unpack_iso_ASCII ,_pack_iso_ASCII },
/* ISO_ANSB */ {_unpack_iso_ASCII ,_pack_iso_ASCII },
/* ISO_ANP */ {_unpack_iso_ASCII ,_pack_iso_ASCII },
/* ISO_B */ {_unpack_iso_BINARY,_pack_iso_BINARY},
/* ISO_Z */ {_unpack_iso_BINARY,_pack_iso_BINARY},
/* ISO_BMAP */ {_unpack_iso_BITMAP,_pack_iso_BITMAP} };
将/* ISO_Z / {_unpack_iso_BINARY,_pack_iso_BINARY},这一行改为 / ISO_Z */ {_unpack_iso_ASCHEX,_pack_iso_ASCHEX},即可。
MTI