Swift開發(fā) 微信支付

引言

集成微信SDK就不廢話了,在微信第三方登錄做了介紹躺同,傳送門:微信第三方登錄

簽名

微信支付個(gè)人覺得最難的就是簽名這個(gè)概念。其實(shí)就是拼接參數(shù)然后MD5加密得到的一串字符串一樣的東西。而當(dāng)我們要去請求微信官方的接口必須帶上簽名這個(gè)參數(shù)扯俱,關(guān)于簽名的校驗(yàn)官方也提供了校驗(yàn)工具微信官方校驗(yàn)工具

1.統(tǒng)一下單

  • URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder
    統(tǒng)一下單請求參數(shù).png
  • 大概意思就是要傳這些參數(shù)給微信,統(tǒng)一下單所需的參數(shù)中的 sign 我們叫一次簽名喇澡。
    1.請求統(tǒng)一下單接口如果成功迅栅,會返回預(yù)支付訂單號prepay_id

2.調(diào)起支付接口

  • 在開發(fā)中,我們有簽名的地方一般都會放在后臺去處理晴玖,所以下面代碼是我請求我們服務(wù)器读存,讓后臺去統(tǒng)一下單,返回給我調(diào)起微信支付接口所需要的參數(shù)呕屎。
func getData(_ oids: String){
        let url = "http://m.tdamm.com/goods/pay/paydo?oids=\(oids)&pay_type=wxpay"
        RequestTool.POSTRequestWith(url, parameters: nil, success: { (task, data) in
            let dict = data as! NSDictionary
            var code = dict.object(forKey: "code") as! Int
            if code == 200{
                let pay_info = (dict.object(forKey: "data") as! NSDictionary).object(forKey: "pay_info") as! NSDictionary
                let prepay_id = pay_info.object(forKey: "prepay_id") as! String
                let sign = (dict.object(forKey: "data") as! NSDictionary).object(forKey: "sign") as! String
                let noncestr = (dict.object(forKey: "data") as! NSDictionary).object(forKey: "noncestr") as! String
                let time = (dict.object(forKey: "data") as! NSDictionary).object(forKey: "timestamp") as! Int
                //調(diào)起微信
                let req = PayReq()
                //應(yīng)用的AppID(固定的)
                req.openID = WXAppID
                //商戶號(固定的)
                req.partnerId = WXPartnerID
                //擴(kuò)展字段(固定的)
                req.package = "Sign=WXPay"
                //統(tǒng)一下單返回的預(yù)支付交易會話ID
                req.prepayId = prepay_id
                //隨機(jī)字符串
                req.nonceStr = noncestr
                //時(shí)間戳(10位)
                req.timeStamp = UInt32(time)
                //簽名
                req.sign = sign
                WXApi.send(req)
            }
        }) { (task, error) in
            print(error)
        }
    }
  • 從代碼來看让簿,很清楚IOS調(diào)起微信支付接口需要7個(gè)參數(shù),分別是
//應(yīng)用的AppID(固定的)
req.openID = WXAppID
//商戶號(固定的)
req.partnerId = WXPartnerID
//擴(kuò)展字段(固定的)
req.package = "Sign=WXPay"
//統(tǒng)一下單返回的預(yù)支付交易會話ID
req.prepayId = prepay_id
//隨機(jī)字符串
req.nonceStr = noncestr
//時(shí)間戳(10位)
req.timeStamp = UInt32(time)
//簽名
req.sign = sign

而這次要用到的sign我們稱為二次簽名秀睛,因?yàn)橐婚_始后臺不知道生成這個(gè)sign要用什么參數(shù)尔当,所以我自己在iOS端自己MD5加密了。下面是我網(wǎng)上找的MD5加密擴(kuò)展方法蹂安。

extension String {
    // MD5 加密字符串
    var MD5: String {
        let cStr = self.cString(using: .utf8);
        let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: 16)
        CC_MD5(cStr!,(CC_LONG)(strlen(cStr!)), buffer)
        let md5String = NSMutableString()
        for i in 0..<16 {
            md5String.appendFormat("%02x", buffer[i])
        }
        free(buffer)
        return md5String as String
    }
}

let strA = "appid=\(WXAppID)&noncestr=\(noncestr)&package=Sign=WXPay&partnerid=\(WXPartnerID)&prepayid=\(prepay_id)&timestamp=\(time)"
req.sign = ("\(strA)&key=\(key)").MD5.uppercased()
  • 通過上面的加密代碼居凶,第二次簽名生成所需的參數(shù)就一目了然了虫给,注意順序和大小寫,一共是7個(gè)參數(shù)侠碧,分別是appid抹估,noncestr,package弄兜,partnerid药蜻,prepayid,timestamp替饿,key(其中的key是你的商戶秘鑰语泽,官方給出的key設(shè)置路徑:微信商戶平臺(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->密鑰設(shè)置)。不得不吐槽的就是视卢,當(dāng)初給我的key是錯(cuò)誤的踱卵,導(dǎo)致一直彈簽名失敗的提示框,真的很坑据过。
    微信官方校驗(yàn)工具通過這個(gè)工具惋砂,如果和你生成的sign一樣,那你就要看下是不是有的參數(shù)錯(cuò)了绳锅。

3.最后在你的AppDeleate中加入微信的回調(diào)方法

  • 當(dāng)然也別忘記了注冊微信(注冊了就無視)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        //MARK: -注冊微信
        WXApi.registerApp(WXAppID)
        return true
}
//  微信回調(diào)
func onResp(_ resp: BaseResp!) {
        var strTitle = "支付結(jié)果"
        var strMsg = "what:\(resp.errCode)"
        print(resp.errCode)
        //  微信支付回調(diào)
        if resp.isKind(of: PayResp.self)
        {
            print("retcode = \(resp.errCode), retstr = \(resp.errStr)")
            switch resp.errCode
            {
            //  支付成功
            case 0 :
              NotificationCenter.default.post(name: NSNotification.Name(rawValue: "WXPaySuccessNotification"), object: nil)
            //  支付失敗
            default:
              WXPayFail()
            }
        }
        //  微信登錄回調(diào)
        if resp.errCode == 0 && resp.type == 0{//授權(quán)成功
                let response = resp as! SendAuthResp
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: "WXLoginSuccessNotification"), object: response.code)
     }
}

總結(jié)

總體來說代碼很簡單西饵,如果后臺把調(diào)用統(tǒng)一下單接口,二次簽名之后鳞芙,直接返回給你對應(yīng)的參數(shù)眷柔,你直接拿后臺返回給你的參數(shù),一一對應(yīng)的微信調(diào)起接口的參數(shù)就可以了原朝。但是由于后臺一開始沒做過驯嘱,所以我也當(dāng)系統(tǒng)的了解一下微信支付的流程吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喳坠,一起剝皮案震驚了整個(gè)濱河市宙拉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丙笋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煌贴,死亡現(xiàn)場離奇詭異御板,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)牛郑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門怠肋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淹朋,你說我怎么就攤上這事笙各《ご穑” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵杈抢,是天一觀的道長数尿。 經(jīng)常有香客問我,道長惶楼,這世上最難降的妖魔是什么右蹦? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮歼捐,結(jié)果婚禮上何陆,老公的妹妹穿的比我還像新娘。我一直安慰自己豹储,他們只是感情好贷盲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剥扣,像睡著了一般巩剖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朦乏,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天球及,我揣著相機(jī)與錄音,去河邊找鬼呻疹。 笑死吃引,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刽锤。 我是一名探鬼主播镊尺,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼并思!你這毒婦竟也來了庐氮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宋彼,失蹤者是張志新(化名)和其女友劉穎弄砍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體输涕,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡音婶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莱坎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衣式。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碴卧,到底是詐尸還是另有隱情弱卡,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布住册,位于F島的核電站婶博,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏界弧。R本人自食惡果不足惜凡蜻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垢箕。 院中可真熱鬧划栓,春花似錦、人聲如沸条获。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帅掘。三九已至委煤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間修档,已是汗流浹背碧绞。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吱窝,地道東北人讥邻。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像院峡,于是被迫代替她去往敵國和親兴使。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容