美文网首页
微信发票开发的iOS流程

微信发票开发的iOS流程

作者: EndLessZ | 来源:发表于2019-10-22 14:20 被阅读0次

微信发票开发的iOS流程

1、使用GET请求获取微信access_token

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务。关于 access_token 的更多介绍,请参考公众号开发文档。 请求方式
请求URL:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
请求方法:GET

    NSDictionary *parm = @{
                           @"grant_type":@"client_credential",
                           @"appid":appid,
                           @"secret":secret,
                           };
    NSString *url = @"https://api.weixin.qq.com/cgi-bin/token";

2、使用拿到的access_token通过GET请求拿到ticket

ticket用于加强安全性。ticket的有效期目前为2个小时,需定时刷新。建议公众号开发者使用中控服务器统一获取和刷新ticket。 请求方式
请求URL:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card
请求方法:GET

    NSDictionary *parm = @{
                           @"type":@"wx_card",
                           @"access_token":token,
                           };
    NSString *url = @"https://api.weixin.qq.com/cgi-bin/ticket/getticket";

3、对拿到的ticket等信息进行排序加密,生成cardSign

卡券签名cardSign说明
1.将 api_ticket、appid、location_id、timestamp、nonce_str、card_id、card_type的value值进行字符串的字典序排序。
2.将所有参数字符串拼接成一个字符串进行sha1加密,得到cardSign。

    NSMutableDictionary *cardSignDic = [NSMutableDictionary dictionary];
    [cardSignDic setObject:nonceStr forKey:@"nonceStr"];
    [cardSignDic setObject:timeStr forKey:@"timestamp"];
    [cardSignDic setObject:apiTicket forKey:@"api_ticket"];
    [cardSignDic setObject:@"INVOICE" forKey:@"cardType"];
    [cardSignDic setObject:appid forKey:@"appid"];
    NSMutableString *contentString = [NSMutableString string];
    NSArray *values = [cardSignDic allValues];
    //按字母顺序排序
    NSArray *sortedArray = [values sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [obj1 compare:obj2 options:NSNumericSearch];
    }];
    //拼接字符串
    for (NSString *value in sortedArray) {
        [contentString appendFormat:@"%@", value];
    }
    NSString *cardSign = [self sha1:contentString];

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 = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++){
        [output appendFormat:@"%02x", digest[i]];
    }
    return output;
}

4、通过调用微信Api跳转微信(注:传入的时间戳要和之前进行sha1加密的时间戳相同)

    WXChooseInvoiceReq *cardReq = [[WXChooseInvoiceReq alloc]init];
    cardReq.appID = appid;
    cardReq.timeStamp = timeStamp;
    cardReq.nonceStr = @"sfim_invoice";
    cardReq.cardSign = cardSign;
    [WXApi sendReq:cardReq];

5、在AppDelegate转发回调

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if ([WXApi handleOpenURL:url delegate:[weChatManager shareInstance]]) {
        return YES;
    }
    if ([self application:application handleOpenURL:url]) {
        return YES;
    }
    return NO;
}

6、在onResp方法里拿到发票的id,再用POST请求 拿到发票详细的信息

 WXChooseInvoiceResp *chooseInvoiceResp = (WXChooseInvoiceResp *)resp;
 NSArray *itemArray = chooseInvoiceResp.cardAry;
 NSMutableArray *resultArray = [NSMutableArray arrayWithCapacity:itemArray.count];
 for (WXInvoiceItem *item in itemArray) {
        NSMutableDictionary *dicM = [NSMutableDictionary dictionary];
        [dicM setObject:item.cardId ? item.cardId : @"" forKey:@"card_id"];
        [dicM setObject:item.encryptCode ? item.encryptCode : @"" forKey:@"encrypt_code"];
        [resultArray addObject:dicM];
}
NSDictionary *listParm = @{
                           @"item_list":resultArray,
                           };
NSString *url = [NSString stringWithFormat:@"https://api.weixin.qq.com/card/invoice/reimburse/getinvoicebatch?access_token=%@",self.accessToken];

done

相关文章

  • 微信发票开发的iOS流程

    微信发票开发的iOS流程 1、使用GET请求获取微信access_token access_token是公众号的全...

  • 收录 : iOS支付开发

    iOS 银联支付开发流程iOS 微信支付开发流程iOS 支付宝支付开发流程iOS Apple Pay开发流程App...

  • iOS微信电子发票获取

    开发目标:实现从微信获取发票列表并多选选择发票在系统中 使用要求:微信开放平台iOS sdk版本1.7.7以上版本...

  • 微信电子发票开发权限全面开放

    微信电子发票开发权限全面开放

  • 微信发票开发

    一、使用GET请求获取微信access_token access_token是公众号的全局唯一接口调用凭据,公众号...

  • iOS支付

    支付宝支付 支付宝支付支付宝补充 微信支付 微信支付 内购 iOS开发 内购流程

  • IOS开发入门之微信支付流程

    本文将带你了解IOS开发入门iOS - 微信支付流程,希望本文对大家学IOS有所帮助。 亲们,首先让我们来看一下微...

  • PHP开发APP微信支付接口

    这段时间在给一个iOS应用程序开发一个微信支付接口,之前并没有接触过微信支付,翻阅了一上午的微信开发文档,对其流程...

  • iOS 微信支付开发流程

    一:介绍 项目中要用到支付功能,需要支付宝支付、支付宝网页支付、微信支付、银联支付、Apple_pay,所以打算总...

  • iOS开发之微信聊天工具栏的封装

    iOS开发之微信聊天工具栏的封装 iOS开发之微信聊天工具栏的封装

网友评论

      本文标题:微信发票开发的iOS流程

      本文链接:https://www.haomeiwen.com/subject/jbdnectx.html