WXSDKHelper.m 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. //
  2. // WXSDKHelper.m
  3. // MingMen
  4. //
  5. // Created by 尚旅客户端 on 2017/8/18.
  6. // Copyright © 2017年 尚旅客户端. All rights reserved.
  7. //
  8. #import "WXSDKHelper.h"
  9. @implementation WXSDKHelper
  10. static WXSDKHelper *sharedObj = nil;
  11. + (instancetype)sharedInstance
  12. {
  13. static dispatch_once_t onceToken = 0;
  14. dispatch_once(&onceToken, ^{
  15. sharedObj = [[super allocWithZone: NULL] init];
  16. });
  17. return sharedObj;
  18. }
  19. + (id) allocWithZone:(struct _NSZone *)zone
  20. {
  21. return [self sharedInstance];
  22. }
  23. - (id) copyWithZone:(NSZone *) zone
  24. {
  25. return self;
  26. }
  27. #pragma mark - 初始化微信SDK
  28. - (void)setWXSDK
  29. {
  30. [WXApi registerApp:WXKey enableMTA:YES];
  31. //向微信注册支持的文件类型 例如word/pdf之类的 暂时没用到
  32. //UInt64 typeFlag = MMAPP_SUPPORT_TEXT | MMAPP_SUPPORT_PICTURE | MMAPP_SUPPORT_LOCATION | MMAPP_SUPPORT_VIDEO |MMAPP_SUPPORT_AUDIO | MMAPP_SUPPORT_WEBPAGE | MMAPP_SUPPORT_DOC | MMAPP_SUPPORT_DOCX | MMAPP_SUPPORT_PPT | MMAPP_SUPPORT_PPTX | MMAPP_SUPPORT_XLS | MMAPP_SUPPORT_XLSX | MMAPP_SUPPORT_PDF;
  33. //[WXApi registerAppSupportContentFlag:typeFlag];
  34. }
  35. #pragma mark - 调用微信分享API
  36. - (void)wxShare:(NSDictionary *)shareDictionary
  37. {
  38. //创建发送对象实例
  39. SendMessageToWXReq *sendReq = [[SendMessageToWXReq alloc] init];
  40. sendReq.bText = NO;//不使用文本信息
  41. sendReq.scene = [shareDictionary[@"scene"] intValue];//0 = 好友列表 1 = 朋友圈 2 = 收藏
  42. //创建分享内容对象
  43. WXMediaMessage *urlMessage = [WXMediaMessage message];
  44. urlMessage.title = shareDictionary[@"title"];//分享标题
  45. urlMessage.description = shareDictionary[@"description"];//分享描述
  46. UIImage *image = shareDictionary[@"image"]!=nil?shareDictionary[@"image"]:NewImageError_J;
  47. [urlMessage setThumbImage:image];//分享图片,使用SDK的setThumbImage方法可压缩图片大小
  48. //创建多媒体对象
  49. WXWebpageObject *webObj = [WXWebpageObject object];
  50. webObj.webpageUrl = [shareDictionary[@"webpageUrl"] length]>0?shareDictionary[@"webpageUrl"]:NewShareURL;//分享链接
  51. //完成发送对象实例
  52. urlMessage.mediaObject = webObj;
  53. sendReq.message = urlMessage;
  54. //发送分享信息
  55. [WXApi sendReq:sendReq];
  56. }
  57. #pragma mark - 调用微信支付API
  58. - (void)wxPay:(NSDictionary *)orderDictionary
  59. {
  60. //已安装较新版本的微信
  61. if([WXApi isWXAppInstalled] == YES && [WXApi isWXAppSupportApi] == YES)
  62. {
  63. //NSString *appid, *mch_id, *prepay_id;//这三个字段需要我们自己的服务器配置
  64. NSString *time_stamp, *nonce_str;
  65. //设置支付参数
  66. time_t now;
  67. time(&now);
  68. time_stamp = [NSString stringWithFormat:@"%ld", now];
  69. nonce_str = [time_stamp md5];
  70. PayReq *request = [[PayReq alloc] init];
  71. //微信号和AppID组成的唯一标识
  72. request.openID = orderDictionary[@"openID"];
  73. //商户号
  74. request.partnerId = orderDictionary[@"partnerId"];
  75. //预支付订单ID
  76. request.prepayId = orderDictionary[@"prepayId"];
  77. //商家 财付通签名 这个是固定写死
  78. request.package = @"Sign=WXPay";
  79. //随机串
  80. request.nonceStr = nonce_str;
  81. //请求时间
  82. request.timeStamp = [time_stamp intValue];
  83. //商家 微信开发平台签名 64F0562166BFA93EC49F05C70E587ABB 9C6819BB8D3D88DDD4FF7A0927FB7315
  84. // 构造参数列表
  85. NSMutableDictionary *params = [NSMutableDictionary dictionary];
  86. [params setObject:request.openID forKey:@"openID"];
  87. [params setObject:nonce_str forKey:@"noncestr"];
  88. [params setObject:@"Sign=WXPay" forKey:@"package"];
  89. [params setObject:request.partnerId forKey:@"partnerid"];
  90. [params setObject:time_stamp forKey:@"timestamp"];
  91. [params setObject:request.prepayId forKey:@"prepayid"];
  92. request.sign = [NewUtils createMd5Sign:params];
  93. NSLog(@"\nAppId:%@\n商户号:%@\n预支付订单ID:%@\n商家签名:%@\n随机字符串:%@\n请求时间:%u\nSign签名:%@",request.openID,request.partnerId,request.prepayId,request.package,request.nonceStr,(unsigned int)request.timeStamp,request.sign);
  94. [WXApi sendReq:request];
  95. }else
  96. {
  97. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
  98. message:@"请去AppStore下载最新版本微信APP"
  99. delegate:self
  100. cancelButtonTitle:@"确定"
  101. otherButtonTitles:nil];
  102. [alert show];
  103. /*
  104. UIAlertController *alertController1 = [UIAlertController alertControllerWithTitle:@"温馨提示" message:[WXApi isWXAppInstalled] == NO ?@"检测到你的手机还没有安装微信,是否现在安装 ?" : [WXApi isWXAppSupportApi] == NO ? @"请升级最新版本微信 !" : @"检测微信失败 !" preferredStyle:(UIAlertControllerStyleAlert)];
  105. UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"立即前往下载" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {
  106. NSString *string=[WXApi getWXAppInstallUrl];
  107. NSURL *url=[NSURL URLWithString:string];
  108. [[UIApplication sharedApplication] openURL:url];
  109. [self.navigationController popToRootViewControllerAnimated:YES];
  110. }];
  111. UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:^(UIAlertAction *action) {
  112. //[self.navigationController popToRootViewControllerAnimated:YES];
  113. }];
  114. [alertController1 addAction:okAction];
  115. [alertController1 addAction:cancelAction];
  116. */
  117. }
  118. }
  119. #pragma mark - 下面三个方法都是处理微信通过URL启动App时传递的数据
  120. - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
  121. {
  122. return [WXApi handleOpenURL:url delegate:self];
  123. }
  124. // NOTE: iOS9.0以后使用新API接口
  125. - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
  126. {
  127. return [WXApi handleOpenURL:url delegate:self];
  128. }
  129. // NOTE: iOS9.0之前使用旧API接口
  130. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
  131. {
  132. return [WXApi handleOpenURL:url delegate:self];
  133. }
  134. #pragma mark - 微信回调方法
  135. -(void) onResp:(BaseResp*)resp
  136. {
  137. //微信支付回调
  138. if ([resp isKindOfClass:[PayResp class]])
  139. {
  140. PayResp *response = (PayResp *)resp;
  141. switch (response.errCode) {
  142. case WXSuccess: {
  143. _NewWXSdkCallback?_NewWXSdkCallback([NSString stringWithFormat:@"%d",response.errCode]):nil;
  144. break;
  145. }
  146. /*
  147. case WXErrCodeCommon: {
  148. //普通错误类型
  149. break;
  150. }
  151. case WXErrCodeUserCancel: {
  152. //用户点击取消并返回
  153. break;
  154. }
  155. case WXErrCodeSentFail: {
  156. //发送失败
  157. break;
  158. }
  159. case WXErrCodeAuthDeny: {
  160. //授权失败
  161. break;
  162. }
  163. case WXErrCodeUnsupport: {
  164. //微信不支持
  165. break;
  166. }
  167. */
  168. default: {
  169. _NewWXSdkCallback?_NewWXSdkCallback([NSString stringWithFormat:@"%@",response.errStr]):nil;
  170. break;
  171. }
  172. }
  173. }
  174. //微信分享回调
  175. else if ([resp isKindOfClass:[SendMessageToWXResp class]])
  176. {
  177. SendMessageToWXResp *sendResp = (SendMessageToWXResp *)resp;
  178. switch (sendResp.errCode) {
  179. case WXSuccess: {
  180. _NewWXSdkCallback?_NewWXSdkCallback([NSString stringWithFormat:@"%d",sendResp.errCode]):nil;
  181. break;
  182. }
  183. default: {
  184. _NewWXSdkCallback?_NewWXSdkCallback([NSString stringWithFormat:@"%@",sendResp.errStr]):nil;
  185. break;
  186. }
  187. }
  188. }
  189. /*
  190. //微信登录回调
  191. else if ([resp isKindOfClass:[SendAuthResp class]])
  192. {
  193. SendAuthResp *sendResp = (SendAuthResp *)resp;
  194. switch (sendResp.errCode) {
  195. case WXSuccess: {
  196. //登录成功
  197. break;
  198. }
  199. default: {
  200. //登录失败
  201. break;
  202. }
  203. }
  204. }
  205. */
  206. }
  207. @end