调用支付jsapi缺少参数package_iOS微信支付(Swift)
生活随笔
收集整理的這篇文章主要介紹了
调用支付jsapi缺少参数package_iOS微信支付(Swift)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
微信支付的iOS的Demo不言而喻,所有的參數都是后臺生成傳過來的,完全沒參考價值,并且有的注意點文檔上也沒說,現在我就說一下微信支付開發中需要注意的地方
項目配置
把實例項目中的一下文件拖到項目中
Control文件夾下的WXApiManager.h和WXApiManager.m libWeChatSDK.a WXApi.h WXApiObject.h橋接文件中添加引用
//微信支付 #import "WXApi.h" #import "WXApiObject.h" #import "WXApiManager.h"項目配置選項卡Info中URL Types中的添加一項
identifier 設置為 weixin URL Schemes 設置為你app微信開放平臺上的appid在AppDelegate中注冊
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {//微信支付WXApi.registerApp("你的APPID "); }func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool {return WXApi.handleOpenURL(url, delegate: WXApiManager.sharedManager());//return UMSocialSnsService.handleOpenURL(url); }//這里演示多個共存的處理方法,其中中間是和微信有關的 func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {//支付寶支付if(sourceApplication!.containsString("com.alipay.iphoneclient")){AlipaySDK.defaultService().processOrderWithPaymentResult(url, standbyCallback: nil)return true;}//微信支付else if(sourceApplication!.containsString("com.tencent.xin")){return WXApi.handleOpenURL(url, delegate: WXApiManager.sharedManager());}//友盟分享else{return UMSocialSnsService.handleOpenURL(url);} }需要的三個參數
appid (微信開放平臺中獲取) partnerId (商戶ID,在商戶平臺獲取) API_KEY (API密鑰,在商戶平臺設置)iOS開發交流技術群:[563513413](正在跳轉),不管你是大牛還是小白都歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 大家一起交流學習成長!
支付步驟
支付總體上分為兩步
第一步獲取prepayid 這一步比較變態,它不像平常我們請求接口那樣傳參,而是把參數和值又拼成XML,再寫入request中,實現起來較麻煩,官方也是在后臺去實現的,所以建議第一步在后臺實現,app端直接掉后臺提供的接口
第二步發起請求 這一步除下簽名相對麻煩點其他都很簡單
代碼
let req = PayReq(); req.partnerId = LoadData.WX_PARTNERID;//商戶ID req.prepayId = prepayId;//預支付ID req.nonceStr = nonceStr;//和第一步一樣的隨機數 req.timeStamp = UInt32(NSDate(timeIntervalSinceNow: 0).timeIntervalSince1970);//時間戳 req.package = "Sign=WXPay";//固定值var dic:[String:String] = [:]; dic["appid"] = LoadData.WX_APPID;//APPID dic["partnerid"] = LoadData.WX_PARTNERID;//商戶ID dic["prepayid"] = prepayId; dic["package"] = "Sign=WXPay"; dic["noncestr"] = req.nonceStr; dic["timestamp"] = "(req.timeStamp)";//下面參數中的key是 API密鑰 let sign = ZJ_WXPayUtils.getSign(dic, key: LoadData.WX_APIKEY);//獲取簽名 req.sign = sign; WXApi.sendReq(req);下面提供一下我用的工具類
import Foundation import CryptoSwiftclass ZJ_WXPayUtils{static var xiadanUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";static var appid = "";//公眾賬號IDstatic var mch_id = "";//商戶號static var nonce_str = "";//隨機字符串static var sign = "";//簽名static var body = "";//商品描述static var out_trade_no = "";//商戶訂單號static var total_fee:Int = 0;//總金額 單位為分static var spbill_create_ip = "";//終端IPstatic var notify_url = "";//通知地址static var trade_type = "JSAPI";//交易類型///獲取隨機數 包括from 包括tostatic func getRandomNum(from:Int,to:Int) -> Int{let result = Int(from + (Int(arc4random()) % (to - from + 1)));return result;}static func getSign(dic:Dictionary<String,String>,key:String) -> String{var sign = "";let dicNew = dic.sort { (a, b) -> Bool inreturn a.0 < b.0;}sign = getQueryStrByDic(dicNew);sign += "&key=(key)";sign = sign.md5().uppercaseString;return sign;}static func getQueryStrByDic(dic:[(String,String)])->String{var pars = "";for (index, element) in dic.enumerate() {if(index == 0){pars += "(element.0)=(element.1)";}else{pars += "&(element.0)=(element.1)";}}return pars;}}工具類中用到的第三方庫
pod 'CryptoSwift'總結
以上是生活随笔為你收集整理的调用支付jsapi缺少参数package_iOS微信支付(Swift)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大疆三款新品杀到:重新定义“稳”
- 下一篇: 为什么不能睁一只眼闭一只眼_自媒体人上哪