開發(fā)目標(biāo):實現(xiàn)從微信獲取發(fā)票列表并多選選擇發(fā)票在系統(tǒng)中
使用要求:微信開放平臺iOS sdk版本1.7.7以上版本(增加發(fā)票)
開發(fā)步驟(比較簡單,均通過微信官文get請求完成,我用的AF請求的,這個隨意)
1、請求AccessToken,只需你的appid 和 appsecret就行了;不過這個一般都是由服務(wù)器來控制,便于管理,時限是7200s。
- (void)getWxAccessToken
2、獲取api_ticket,需要用到第一步的AccessToken;臨時票據(jù),后面簽名使用
(void)getWxApi_ticket
{
//https請求方式: GET
AFHTTPSessionManager *manager =[AFHTTPSessionManager manager];
NSMutableDictionary *mudic = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"wx_card",@"type", nil];
//上文提供的
[mudic setObject:access_token forKey:@"access_token"];
[managerGET:@"https://api.weixin.qq.com/cgi-bin/ticket/getticket" parameters:mudicprogress:nil success:^(NSURLSessionDataTask * _Nonnull task, id_Nullable responseObject) {
NSString *ticket = [responseObject objectForKey:@“ticket”];
}failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error){}];}
3、獲取簽名方法,需要用到的參數(shù),看下圖方法:

- (NSString *)getCardsign
{
NSMutableDictionary *parDic = [NSMutableDictionary dictionary];
NSString *timestamp = [NSStringstringWithFormat:@"%ld",(long)[NSDate date].timeIntervalSince1970];
[parDic setObject:timestamp forKey:@"timestamp"];
NSString *nonceStr= [NSStringstringWithFormat:@"%d", rand()];
[parDic setObject:nonceStr forKey:@"nonceStr"];
[parDic setObject:[[NSUserDefaults standardUserDefaults]objectForKey:@"wx_ticket"] forKey:@"api_ticket"];
[parDic setObject:WXAPPKEY forKey:@"appid"];
[parDic setObject:@"INVOICE" forKey:@"cardType"];
//先把這個存起來,因為后面進入微信用到的時間戳,要和簽名這一致,不然拿不到發(fā)票列表
[[NSUserDefaults standardUserDefaults] setObject:parDic forKey:@“cardSignDic"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSMutableString *contentString=[NSMutableString string];
NSArray *values = [parDic allValues];
//按字母順序排序
NSArray *sortedArray = [valuessortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
}];
//拼接字符串
for (NSString *value in sortedArray) {
[contentString appendFormat:@"%@", value];
}
NSString *cardSign = [self sha1:contentString];
return cardSign;
}
//sha1加密方式
- (NSString *)sha1:(NSString *)input
{
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (unsigned int)data.length, digest);
NSMutableString *output = [NSMutableStringstringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for(int i=0; i<CC_SHA1_DIGEST_LENGTH;i++){
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
4、進入微信,請求發(fā)票信息
//請求發(fā)票信息
+ (BOOL)chooseInvoice
{
NSDictionary *parDic = [[NSUserDefaults standardUserDefaults] objectForKey:@"cardSignDic"];
WXChooseInvoiceReq *chooseInvoiceReq = [[WXChooseInvoiceReq alloc] init];
chooseInvoiceReq.appID = appid;
//前面獲取的
chooseInvoiceReq.cardSign = xxx;
//前面存的
chooseInvoiceReq.nonceStr = [parDic objectForKey:@"nonceStr"];
chooseInvoiceReq.signType = @"SHA1";
//前面存的
chooseInvoiceReq.timeStamp = [[parDic objectForKey:@"timestamp"] doubleValue];
return [WXApi sendReq:chooseInvoiceReq];
}
到這就可以進入到微信,看到你開的電子發(fā)票的列表了;
怎么獲取信息?
進入appdelegate
- (BOOL) application:(UIApplication*)application openURL:(nonnull NSURL *)url sourceApplication:(nullable NSString*)sourceApplication annotation:(nonnull id)annotation {
NSLog(@"%@", url.absoluteString);
NSLog(@"Calling Application Bundle ID: %@",sourceApplication);
NSLog(@"URL scheme:%@", [url scheme]);
NSLog(@"URL query: %@", [url query]);
if([sourceApplication rangeOfString:WXAPP_ID].length > 0) {
//設(shè)置實現(xiàn)回調(diào)的類,寫上面的方法的單例類就行
return [WXApi handleOpenURL:url delegate:yourdelegate];
}
return YES;
}
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL *)url {
//設(shè)置實現(xiàn)回調(diào)的類,寫上面的方法的單例類就行
return[WXApi handleOpenURL:urldelegate:yourdelegate];
}
回調(diào)方法:
-(void)onResp:(BaseResp*)resp
{
if ([resp isKindOfClass:[WXChooseInvoiceResp class]]){
//這里面有數(shù)組,自己怎么用都行了,over
WXChooseInvoiceResp *chooseInvoiceResp = (WXChooseInvoiceResp *)resp;
}
}
很簡單,微信良心。