實用技術——支付_微信

  • 與微信官方簽署在線協議

  • 導入微信支付需要的SDK相關文件

  • 配置App跳轉的白名單

  • 添加URL Schemes

  • 配置代碼

    1. 在AppDelegate.m中向微信注冊第三方應用
      //向微信終端程序注冊第三方應用
      [WXApi registerApp:wexinAppId];
    2. 確保支付結果回調方法能夠接受到,在AppDelegate.m中添加一下代碼
      - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
      if([url.host isEqualToString:@"pay"]){
      return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
      }else{
      return YES;
      }
      }
      - (BOOL)application:(UIApplication *)application handleOpenURL:(nonnull NSURL *)url
      {
      if([url.host isEqualToString:@"pay"]){
      return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
      }else{
      return YES;
      }
      }
      - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
      if([url.host isEqualToString:@"pay"]){
      return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
      }else{
      return YES;
      }
      }
    • 設置支付信息,調用微信支付
      NSMutableDictionary dict = [result[@"data"] objectAtIndex:0];
      //調起微信支付
      PayReq
      req = [[PayReq alloc] init];
      //由用戶微信號和AppID組成的唯一標識
      req.openID = [dict objectForKey:@"appid"];
      //商家向財付通申請的商家id
      req.partnerId = [dict objectForKey:@"mch_id"];
      //預支付訂單
      req.prepayId = [dict objectForKey:@"prepay_id"];
      //隨機串,防重發
      req.nonceStr = [dict objectForKey:@"nonce_str"];
      //時間戳,防重發
      req.timeStamp = [[dict objectForKey:@"timeStamp"] intValue];
      //商家根據財付通文檔填寫的數據和簽名
      req.package = @"Sign=WXPay";
      //商家根據微信開放平臺文檔對數據做的簽名
      req.sign = [self getWeiXinPaySign:req];
      [WXApi sendReq:req];

    • 處理支付結果
      為了對支付結果可以進行不同的操作處理,可以創建一個單例對象來管理。
      #import <Foundation/Foundation.h>
      #import "WXApi.h"
      @protocol WXApiManagerDelegate <NSObject>
      @optional
      - (void)managerDidRecvPayForSuccessResponse:(PayResp *)response;

      - (void)managerDidRecvPayForFailResponse:(PayResp *)response;
      @end
      
      @interface WXApiManager : NSObject<WXApiDelegate>
      @property (nonatomic, assign) id<WXApiManagerDelegate> delegate;
      + (instancetype)sharedManager;
      @end
      
      #import "WXApiManager.h"
      @implementation WXApiManager
      
      #pragma mark - LifeCycle
      +(instancetype)sharedManager {
        static dispatch_once_t onceToken;
        static WXApiManager *instance;
        dispatch_once(&onceToken, ^{
        instance = [[WXApiManager alloc] init];
        });
      return instance;
      }
      
      - (void)dealloc {
        self.delegate = nil;
        [super dealloc];
      }
      
      #pragma mark - WXApiDelegate
      - (void)onResp:(BaseResp *)resp {
          if([resp isKindOfClass:[PayResp class]]){
              switch (resp.errCode) {
                  case WXSuccess:
                  {
                      if (_delegate && [_delegate respondsToSelector:@selector(managerDidRecvPayForSuccessResponse:)]) {
                      PayResp *payResp = (PayResp *)resp;
                      [_delegate managerDidRecvPayForSuccessResponse:payResp];
              }
          }
              break;
              
          default:
              if (_delegate && [_delegate respondsToSelector:@selector(managerDidRecvPayForFailResponse:)]) {
                  PayResp *payResp = (PayResp *)resp;
                  [_delegate managerDidRecvPayForFailResponse:payResp];
              }
              break;
          }
        }
      }
      @end
      
    • 簽名sign生成方法
      //獲取微信簽名
      -(NSString)getWeiXinPaySign:(PayReq)req
      {
      NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
      [signParams setObject: req.openID forKey:@"appid"];
      [signParams setObject: req.nonceStr forKey:@"noncestr"];
      [signParams setObject: req.package forKey:@"package"];
      [signParams setObject: req.partnerId forKey:@"partnerid"];
      [signParams setObject: [NSString stringWithFormat:@"%u",(unsigned int)req.timeStamp] forKey:@"timestamp"];
      [signParams setObject: req.prepayId forKey:@"prepayid"];
      //生成簽名
      NSString *sign = [self createMd5Sign:signParams];
      return sign;
      }

      //創建package簽名
      -(NSString*) createMd5Sign:(NSMutableDictionary*)dict
      {
          NSMutableString *contentString  =[NSMutableString string];
          NSArray *keys = [dict allKeys];
          //按字母順序排序
          NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
              return [obj1 compare:obj2 options:NSNumericSearch];
          }];
          //拼接字符串
          for (NSString *categoryId in sortedArray) {
              if (![[dict objectForKey:categoryId] isEqualToString:@""] &&
                  ![categoryId isEqualToString:@"sign"] &&
                  ![categoryId isEqualToString:@"key"]){
              
                  [contentString appendFormat:@"%@=%@&", categoryId, [dict objectForKey:categoryId]];
                 }
              }
          //添加key字段,商戶密鑰
          [contentString appendFormat:@"key=%@", @"xxxxxxxxxxx"];
          //得到MD5 sign簽名
          NSString *md5Sign =[WXUtil md5:contentString];
          return md5Sign;
        }
      //md5 encode
      +(NSString *) md5:(NSString *)str
      {
          const char *cStr = [str UTF8String];
          unsigned char digest[CC_MD5_DIGEST_LENGTH];
          CC_MD5( cStr, (unsigned int)strlen(cStr), digest );
      
          NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
          //這里的x是小寫則產生的md5也是小寫,是大寫則產生的md5是大寫
          for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
              [output appendFormat:@"%02X", digest[i]];
      
          return output;
      }
      
  • 注意事項:

    1. 簽名Sign一定得進行MD5加密,格式嚴格按照微信官方方式加密。
      prepayId(預支付訂單)失效、過期。
      如果出現上述問題(一般是參數錯誤),就會造成調起微信支付,只出現一個確定按鈕
    • 支付結果無法獲取回調?
      確保第四步的b步驟是否實現
    • 如果APP里面使用了友盟或者ShareSDK做分享,那就不用再導入SDK了,否則會出現一些詭異的問題,
      例如無法調起手機微信客戶端、無法調起微信客戶端web頁面,調起了但是一閃而過。這都基本上都是因為分享的SDK里面已經包括了微信的SDK。所以如果出現詭異的錯誤了看看是不是兩個沖突了。
    • 如果你用了友盟社會化分享來做微信登錄的話,那么你要先用友盟注冊微信,后調用微信SDK注冊
      [UMSocialWechatHandlersetWXAppId:SHappSecret:SH url:SHAREURL];
      [WXApiregisterApp:SHARE_WX withDescription:@"demo"];
    • 微信無法調起
      未安裝微信、未將微信加入白名單
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容

  • iOS支付 iOS支付分為兩類,第三方支付和應用內支付(內購)。 第三方支付包括:支付寶支付、微信支付、銀聯支付、...
    請輸入賬號名閱讀 6,252評論 3 22
  • 官方建議使用服務器簽名來接入微信支付,從安全上考慮,客戶端不應該知道RAS密鑰,也不需要每個客戶端都寫一遍簽名的算...
    wpf_register閱讀 492評論 0 2
  • 01 木子說來世她一定要做一棵安靜的樹,開心時開花,難過時落葉。她就可以再也不用理會塵世間的那些紛紛擾擾了。 木子...
    愛上世界的張大路閱讀 604評論 8 14
  • 清晨五點,就已醒來,昨晚打球身體疲乏,睡眠質量不高,醒來又進行了劇烈的運動,消耗了不少的體力,致使鬧鐘的呼喊我還是...
    江流_ddba閱讀 176評論 0 0