• 首先是关于关于IOS微信的支付分享或登录 成功起客户端操作之后,返回你的应用之后onResp:方法被执行的问题。 //这里说明一下,上次的集成告诉大家在Appdelegate.m里加入如下两个方法,并完成对Wxi的...

    首先是关于关于IOS微信的支付分享或登录   成功调起客户端操作之后,返回你的应用之后onResp:方法不被执行的问题。


    //这里说明一下,上次的集成告诉大家在Appdelegate.m里加入如下两个方法,并完成对Wxi的delegate的设置。这两个方法在官方的文档上注明了IOS9.0之后废弃(但其实9.1好像也能用),不管怎样,如果你是Xcode7.2,或者IOS9.2的话,可能会遇见在微信客户端操作返回程序之后不能执行微信的onResp回调方法的问题,就是因为一下这两个方法被废弃掉了,所以我的新demo替换了一个新的方法在下面。就完美解决这个问题了(并不建议删除这两个方法,新方法是9.0以后的方法,可能系统低版本的用户不支持。所以我三种方法都留下了,如果有人发现不能都留下的话,请简信告诉我一下,再次谢过了

    //被废弃的方法如下

    -(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;


    -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url

    sourceApplication:(NSString *)sourceApplication

    annotation:(id)annotation;


    //替换的新方法

    改用方法为- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*)options;


    这些更新都可以在这篇文章上的demo里看到,另外,新的demo里我还新增了IOS的三方分享和三方登录的集成。这样这个demo里就基本完成了三方支付、分享、登录的统一集成。点击这里查看新demo ,所有的集成方法和步骤我都写在readme那个word里了,如果还有其他问题欢迎在评论里问我,希望能帮到你们。

    展开全文
  • 1,保证使用了最新的SDK和正确添加依赖文件 2,首先要保证你正确配置好了编译环境 3,onResp方法要放在Appdelegate.m




    1,保证使用了最新的SDK和正确添加依赖文件


    2,首先要保证你正确配置好了编译环境


    3,onResp方法要放在Appdelegate.m


    展开全文
  • 大家接过微信开放平台的...同样地,在操作完后微信拉起我们自己的应用时也会有一个对应的消息结构体在onResp回调中返回给我们,通过这个resp消息对象可以拿到发这里写代码片起请求的类型以及当前请求的完成状态等。一、A

    大家接过微信开放平台的SDK都应该知道,如果需要向微信发送登录或分享请求时,需要构造一个消息结构体给微信发送过去,登录的结构体类型是SendAuthReq,分享的消息结构体是SendMessageToWXReq。

    同样地,在操作完后微信拉起我们自己的应用时也会有一个对应的消息结构体在onResp回调中返回给我们,通过这个resp消息对象可以拿到发这里写代码片起请求的类型以及当前请求的完成状态等。

    一、Android
    Android中的resp消息对象的errcode属性判断当前操作请求的状态.getType()方法可以区分当前操作请求的类型

    @Override
        public void onResp(BaseResp resp) {
    
            String string;      
            Log.d("JavaUnity", "onResp code=" + resp.errCode);
            switch (resp.errCode) 
            {
            case BaseResp.ErrCode.ERR_OK:
                switch (resp.getType()) {
                case ConstantsAPI.COMMAND_SENDAUTH:
                    //登录成功的回调
                    String code=((SendAuth.Resp)resp).code;
                    if (((SendAuth.Resp) resp).state != null && ((SendAuth.Resp) resp).state.equals("***")) {
                        MainActivity.CallUnity("SDK", "LoginCallback", code);
                    }
                    break;
                case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
                    //分享成功的回调
                    MainActivity.CallUnity("GlobalLogic", "WXShareSucceed", "true");
                    break;
                default:
                    break;
                }
                break;
                    case BaseResp.ErrCode.ERR_USER_CANCEL:
                switch (resp.getType()) {
                case ConstantsAPI.COMMAND_SENDAUTH:
                    //登录取消的回调
                    Log.i("JavaUnity", "登录取消");
                    break;
                case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
                    Log.i("JavaUnity", "分享取消");
                    //分享取消的回调
                    MainActivity.CallUnity("GlobalLogic", "WXShareSucceed", "cancle");
                    break;
                default:
                    break;
                }
                break;
            default:
                switch (resp.getType()) {
                case ConstantsAPI.COMMAND_SENDAUTH:
                    //登录失败的回调
                    break;
                case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
                    //分享失败的回调
                    MainActivity.CallUnity("GlobalLogic", "WXShareSucceed", "false");
                    break;
                default:
                    break;
                }
                break;
            }
            finish();
        }

    二、IOS中

    在IOS中,也是可以通过resp的errCode来判断当前操作请求的状态

            //微信登陆授权回调
            if([resp isKindOfClass:[SendAuthResp class]])
            {
                SendAuthResp *rresp = (SendAuthResp*)resp;
                NSLog(@"resp Errcode%d",rresp.errCode);
                if(rresp.code!=nil) {   //成功
    
                    // 将code(凭据)传给服务器去申请 access_token 以及 userinfo
                    [U3dSendMessage sendU3dMessageforCode:rresp.code];
                }
                else//失败
                {
                    NSLog(@"error %@",rresp.errStr);
                    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"登录失败" message:[NSString stringWithFormat:@"reason : %@",rresp.errStr] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
                    [alert show];
                }
            }
            //微信分享授权回调
            else if([resp isKindOfClass:[SendMessageToWXResp class]])
            {
                SendMessageToWXResp *rresp = (SendMessageToWXResp*)resp;
                NSLog(@"SendMessageToWXResp resp Errcode%d",rresp.errCode);
                switch ((WXErrCode)rresp.errCode) {
                    case WXSuccess:
                        UnitySendMessage("GlobalLogic", "WXShareSucceed", "true");
                        break;
                    case WXErrCodeUserCancel:
                        UnitySendMessage("GlobalLogic", "WXShareSucceed", "cancle");
                        break;
                    default:
                        UnitySendMessage("GlobalLogic", "WXShareSucceed", "false");
                        break;
                }
            }
    展开全文
  • ShareSDK最新的是3.x版本,以前老的2.x需要更新,可能出现的问题:微信支付成功调用onResp、openURL、handleOpenURL等方法

    ShareSDK最新的是3.x版本,以前老的2.x需要更新,毕竟ios9已经更新啦。然后ShareSDK里的最新方法也是肯定更换,这是比较痛苦的事情,项目里又要重新来一遍,检查、测试等。

    按照官网的文档以及demo进行集成,设置白名单、添加文件等。配置微信、支付宝等。

    开始运行项目,编译通过,测试支付,微信支付也成功了,但是发现不回调onResp方法,openURL方法也没有进入,难道项目引入头文件缺少?(onResp、openURL、handleOpenUR方法写在Appdelegate里边)。

    开始查找问题:

    1. ShareSDK 2.x的sdk是可以回调onResp。

    2. 也按照官网的配置要求进行设置。

    3. 官网的demo是可以回调onResp,说明sdk应该是最新的、没有问题。

    4. 检查微信配置文件,appleid、密钥等。

    最后得出问题肯定是初始化sdk的时候出现的。

    那就检查对比官网demo是不是少写了配置,直接检查微信的配置,果然发现问题了,微信的代理没有写,因为这个代码是在官网上复制的,和官网给的demo是不一样的


    demo代码截图


    官网网站代码

    两边对比可以发现:缺少 delegate:self

     [ShareSDKConnector connectWeChat:[WXApi class]];
     [ShareSDKConnector connectWeChat:[WXApi class] delegate:self];


    还需要注意一下Appdelegate需要添加三个方法以及onResp:

    - (BOOL)application:(UIApplication *)application
          handleOpenURL:(NSURL *)url
    {
         return  [WXApi handleOpenURL:url delegate:self];
       
    }
    -(BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary<NSString *,id> *)options
    {
        return  [WXApi handleOpenURL:url delegate:self];
    }
    
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
    
        return  [WXApi handleOpenURL:url delegate:self];
    
    }
    
    
    -(void) onResp:(BaseResp*)resp
    {
        NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];
        if([resp isKindOfClass:[PayResp class]]){
            //支付返回结果
            switch (resp.errCode) {
                case WXSuccess:
                    strMsg = @"支付结果:成功!";
    //                NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
                    break;
                default:
                    strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
    //                NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
                    break;
            }
           
        }
    }
    



    展开全文
  • 直接进入微信支付开发同时针对服务端的微信支付接口调用同android端一致,这里也在叙述直接进入正题,微信支付微信支付步骤编写访问服务器相关获取PrePay信息 使用网络基础库Alamofire访问服务器下载Alamofire库...

    微信支付涉及到 导入sdk,配置桥接文件等,已经在 “微信分享接口实现”文章中说明了,这里就不再重新叙述了。 直接进入微信支付开发

    同时针对服务端的微信支付接口调用同android端一致,这里也不在叙述

    直接进入正题,微信支付

    微信支付步骤

    编写访问服务器相关获取PrePay信息

    1. 使用网络基础库Alamofire访问服务器

      • 下载Alamofire库,导入到项目中
    2. 编写相关程序实现访问服务器

      • Model 编写WXPrePay.swift
      import Foundation
      
      struct WXPrePay {
          let appID: String
          let noncestr: String
          let package: String
          let partnerID: String
          let prepayID: String
          let sign: String
          let timestamp: Int
      
          init(appID: String,
              noncestr: String,
              package: String,
              partnerID: String,
              prepayID: String,
              sign: String,
              timestamp: Int) {
                  self.appID = appID
                  self.noncestr = noncestr
                  self.package = package
                  self.partnerID = partnerID
                  self.prepayID = prepayID
                  self.sign = sign
                  self.timestamp = timestamp
          }
      }
      • Model 编写MyOrder.swift
      import Foundation
      
      struct MyOrder {
          let id : Int
          let title : String
          let content: String
          let url: String
          let createdAt : String
          let price : Double
          let paid : Bool
          let productID : Int
      
          init(id : Int,
              title : String,
              content: String,
              url: String,
              createdAt : String,
              price : Double,
              paid : Bool,
              productID : Int) {
                  self.id = id
                  self.title = title
                  self.content = content
                  self.url = url
                  self.createdAt = createdAt
                  self.price = price
                  self.paid = paid
                  self.productID = productID
          }
      }
      • Services 编写JSON.swift 处理类
      import Foundation
      
      enum JSON {
          case JSONDictionary([String : JSON])
          case JSONArray([JSON])
          case JSONString(String)
          case JSONNumber(NSNumber)
          case JSONBool(Bool)
          case JSONNull
      
          subscript(key:String) -> JSON? {
              switch self {
              case .JSONDictionary(let value) :
                  return value[key]
              default:
                  return nil
              }
          }
      
          subscript(index:Int) -> JSON? {
              switch self {
              case .JSONArray(let value):
                  return value[index]
              default:
                  return nil
              }
          }
      
          var dictionary : [String:JSON]? {
              switch self {
              case .JSONDictionary(let value):
                  return value
              default:
                  return nil
              }
          }
      
          var array : [JSON]? {
              switch self {
              case .JSONArray(let value):
                  return value
              default:
                  return nil
              }
          }
      
          var string : String? {
              get {
                  switch self {
                  case .JSONString(let value):
                      return value
                  default:
                      return nil
                  }
              }
          }
      
          var number : NSNumber? {
              get {
                  switch self {
                  case .JSONNumber(let value):
                      return value
                  default:
                      return nil
                  }
              }
          }
      
          var integer: Int? {
              get {
                  switch self {
                  case .JSONNumber(let value):
                      return value.integerValue
                  case .JSONString(let value):
                      let value = value as NSString
                      return value.integerValue
                  default:
                      return nil
                  }
              }
          }
      
          var double: Double? {
              get {
                  switch self {
                  case .JSONNumber(let value):
                      return value.doubleValue
                  case .JSONString(let value):
                      let value = value as NSString
                      return value.doubleValue
                  default:
                      return nil
                  }
              }
          }
      
      
          var bool : Bool? {
              get{
                  switch self {
                  case .JSONBool(let value):
                      return value
                  case .JSONNumber(let value):
                      return value.boolValue
                  case .JSONString(let value):
                      let value = value as NSString
                      return value.boolValue
                  default:
                      return nil
                  }
              }
          }
      
          static func fromString(str:String) -> JSON? {
              if let jsonData = str.dataUsingEncoding(NSUTF8StringEncoding) {
                  return JSON.fromData(jsonData)
              }
              return nil
          }
      
          static func fromData(jsonData:NSData) -> JSON? {
              if let parsed: AnyObject = try? NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions(rawValue: 0)){
                  return JSON.fromObject(parsed)
              }
              return nil
          }
      
          static func fromObject(object:AnyObject) -> JSON? {
              //println(object.dynamicType)
              //println(object)
              switch object {
              case let value as NSNull:
                  return JSON.JSONNull
              case let value as Bool:
                  return JSON.JSONBool(value)
              case let value as NSNumber:
                  return JSON.JSONNumber(value)
              case let value as String:
                  return JSON.JSONString(value)
              case let value as NSDictionary:
                  var JSONDictionary: [String:JSON] = [:]
                  for(k, v): (AnyObject, AnyObject) in value {
                      if let k = k as? String {
                          if let v = JSON.fromObject(v) {
                              JSONDictionary[k] = v
                          }
                      }
                  }
                  return JSON.JSONDictionary(JSONDictionary)
              case let value as NSArray:
                  var jsonArray : [JSON] = []
                  for v in value {
                      if let v = JSON.fromObject(v) {
                          jsonArray.append(v)
                      }
                  }
                  return JSON.JSONArray(jsonArray)
              default:
                  return nil
              }
          }
      }
      • Services 编写JSONParser.swift 解析处理预定单JSON
      import Foundation
      
      struct JSONParser {
      
          static func parsePrePay(json:JSON) -> WXPrePay {
              let appid:String = json["appid"]?.string ?? ""
              let noncestr:String = json["noncestr"]?.string ?? ""
              let package:String = json["package"]?.string ?? ""
              let partnerid:String = json["partnerid"]?.string ?? ""
              let prepayid:String = json["prepayid"]?.string ?? ""
              let sign:String = json["sign"]?.string ?? ""
              let timestamp:Int = json["timestamp"]?.integer ?? 0
      
              return WXPrePay(appID: appid, noncestr: noncestr, package: package, partnerID: partnerid, prepayID: prepayid, sign: sign, timestamp: timestamp)
          }
      
          static func parseOrder(json:JSON) -> MyOrder {
              let id:Int = json["id"]?.integer ?? 0
              let title:String = json["title"]?.string ?? ""
              let content:String = json["content"]?.string ?? ""
              let createdAt:String = json["createdAt"]?.string ?? ""
              let url:String = json["url"]?.string ?? ""
              let price:Double = json["price"]?.double ?? 0.0
              let paid:Bool = json["paid"]?.bool ?? false
              let pID:Int = json["refID"]?.integer ?? 0
      
              return MyOrder(id: id, title: title, content: content, url: url, createdAt: createdAt, price: price, paid: paid, productID: pID)
          }
      
      }
      • Services 编写DataService.swift 数据访问服务结构体
      import Foundation
      
      struct DataService {
      
          private static let clientID = ""
          private static let clientSecret = ""
      
          private enum ResourcePath: CustomStringConvertible {
              case Purchase
              case WXPayPrePay(orderID:Int)
      
              var description: String {
                  switch self {
                  case .Purchase:  return "/order/purchase"
                  case .WXPayPrePay(let id): return "/api/WXAppPay!app_pay.action?plat=ios&orderid=\(id)"
                  default: return ""
                  }
              }
          }
      
      
      
          static func wxPrePay(orderID:Int, response: (WXPrePay?,NSError?) -> ()) {
              let path = ResourcePath.WXPayPrePay(orderID: orderID)
              let urlString = ServerURL + path.description
      
              request(.GET, urlString, parameters: nil).response { (request, res, data, error) in
                  print(NSString(data: data!, encoding: NSUTF8StringEncoding))
                  if error == nil {
                      if let json = JSON.fromData(data!) {
                          if json["success"]?.bool == true {
                              let r = JSONParser.parsePrePay(json["info"]!["payParam"]!)
                              response(r,nil)
                          } else {
                              response(nil,NSError(domain: "come.apppaydemo", code: 404, userInfo: nil))
                          }
                      }
                  } else {
                      response(nil,error)
                  }
              }
          }
      
      
      }
      • 根目录 编写MyConstants.swift 常量定义类

      “`
      import Foundation

    let WXPaySuccessNotification = “WeixinPaySuccessNotification”

    let WX_APPID = “填写自己的”
    let WX_APP_SECRET = “填写自己的”

    let AppScheme:String = “apppaydemo”

    let ServerURL = “http://youname.com
    “`

    获取PrePay信息

    • viewController 中加入WXApiDelegate
    class ViewController: UIViewController, WKScriptMessageHandler,WXApiDelegate {

    - 加入enum 和 class定义

    enum PaymentType {
        case Weichat
    }
    
    protocol PayMethodViewControllerDelegate: class {
        func paymentSuccess(paymentType paymentType:PaymentType)
        func paymentFail(paymentType paymentType:PaymentType)
    }
    • 定义delegate
    weak var delegate:PayMethodViewControllerDelegate?
    • 编写微信支付函数
        //微信支付
        func weixinPay(orderid:Int) {
            DataService.wxPrePay(orderid) {[weak self] (prepay, error) -> () in
                if let strongSelf = self {
                    if let prepay = prepay {
                        let req = PayReq()
                        req.openID = prepay.appID
                        req.partnerId = prepay.partnerID
                        req.prepayId = prepay.prepayID
                        req.nonceStr = prepay.noncestr
                        req.timeStamp = UInt32(prepay.timestamp)
                        req.package = prepay.package
                        req.sign = prepay.sign
                        WXApi.sendReq(req)
                    } else {
                        strongSelf.delegate?.paymentFail(paymentType: .Weichat)
                        let alert = UIAlertView(title: nil, message: "获取支付信息失败,请重新支付!", delegate: nil, cancelButtonTitle: "好的")
                        alert.show()
                    }
                }
            }
        }

    编写微信支付回调

    func onReq(req: BaseReq!) {
            //onReq是微信终端向第三方程序发起请求,要求第三方程序响应。第三方程序响应完后必须调用sendRsp返回。在调用sendRsp返回时,会切回到微信终端程序界面。
        }
        func onResp(resp: BaseResp!) {
            var strTitle = "支付结果"
            var strMsg = "\(resp.errCode)"
    
            //如果第三方程序向微信发送了sendReq的请求,那么onResp会被回调。sendReq请求调用后,会切到微信终端程序界面。
    
            if resp.isKindOfClass(SendMessageToWXResp){//确保是对我们分享操作的回调
                if resp.errCode == WXSuccess.rawValue{//分享成功
                    NSLog("分享成功")
                }else{//分享失败
                    NSLog("分享失败,错误码:%d, 错误描述:%@", resp.errCode, resp.errStr)
                }
            }
    
            if resp.isKindOfClass(PayResp) {
                switch resp.errCode {
                case 0 :
                    NSNotificationCenter.defaultCenter().postNotificationName(WXPaySuccessNotification, object: nil)
                default:
                    strMsg = "支付失败,请您重新支付!"
                    print("retcode = \(resp.errCode), retstr = \(resp.errStr)")
                }
            }
    
            let alert = UIAlertView(title: nil, message: strMsg, delegate: nil, cancelButtonTitle: "好的")
            alert.show()
    
    
        }
    
    展开全文
  • 我之前写过一篇关于调用QQ分享的文章:Swift - 腾讯官方SDK的配置及使用(分享到QQ空间、分享到好友)。通过使用腾讯提供的 SDK,我们可以从自己的 App 跳转到手机 QQ,将消息分享给QQ 好友或发布到空间上。 ...
  • 发现微信登录执行- (void)onResp:(BaseResp*)resp 的两个原因。 1.在info里面白名单设置错误。 2.在URLTypes里面设置错误。 3.手机上有另一个微信登录,使用了本次的AppID,通常是我们自己写得Demo安装在手机上...
  • iOS中微信登录,在微信授权界面,无论点击确定还是取消,最后都停留在微信里面,也没有执行- (void)onResp:(BaseResp*)resp 方法。找了好久,明明昨天还是可以的,今天居然不行了。最后才发现实URL Types里面知道...
  • 友盟分享微信成功回调  @Override  public void onResp(BaseResp baseResp) {  String result = "";  if (baseResp.getType() == ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX) {  
  • swift中的微信分享

    2015-03-13 11:30:39
    向微信注册appid,成功后 1.在工程Plist文件中添加一个 URL type "URL scheme”为你所注册的应用程序id,既AppID 导入libWeChatSDK.a , WXApi.h , WXApiObject.h 三个文件 在程序登录那个函数注册 ...
  • 比起以往多的步骤就是设置universalLink,及apple-app-site-association的生成和上传,这个可以自行百度搜索结果还是很多的,记得文件加后缀名就行了。 做好准备工作后在Appdelegate中进行注册及回调方法的处理 ...
  • 在同一开放平台账号下的移动应用及小程序无需关联即可完成跳转,非... 可在“管理中心-移动应用-应用详情-关联小程序信息”,为通过审核的移动应用发起关联小程序操作。 唤起 App打开下程序他有两种方式: ...第一...
  • 微信开放平台 一.准备工作 微信开放平台注册账号 在平台进行签约创建应用 二.配置工程 下载SDK 微信支付SDK ...还是最好创建文件夹(WeChatSDK),将文件放入文件夹后再导入工程 ...设置URL Types TARGETS-
  • 所以引入了微信登录和QQ登录,让用户更加便捷的登录操作。大多数的第三方登录都是相仿的,按照集成文档一步步的集成就好了,仔细阅读文档一般没有太...集成的步骤我一一赘述,将我遇到的一些坑列举出来,供大家参考。
  • 有一种先接受后排斥,又欢迎的感觉,纵观国外大牛开源框架或项目演示,Swift几乎占据了多半,而国内虽然出现很多相关技术介绍和教程,但是在真正项目开发中使用的占据很少部分,原因一是目前熟练它的开发者并多,...
  • 但并不是每次都想使用这些第三方的服务的, 这里作者整理了微信, QQ, 新浪微博原生第三方的接入:[Swift]原生第三方接入: 微信篇--集成/登录/分享/支付[Swift]原生第三方接入: QQ篇--集成/登录/分享[Swift]原生...
  • 怎么集成SDK自行百度  1.... func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { ... //向...
  • 亲们, 首先让我们来看一下微信支付的流程吧. ... 2. 下载微信支付sdk 3. 客户端请求订单,后台与...(前台消息可靠,我们需要去后台验证,如果后台没有收到支付通知,后台去微信服务器验证然后将结果返回给客户端)
1 2 3 4
收藏数 70
精华内容 28