调用支付jsapi缺少参数package_iOS微信支付(Swift)

d3ee5a7d350c868f0eca5b48ba834fa8.png

前言

微信支付的iOS的Demo不言而喻,所有的参数都是后台生成传过来的,完全没参考价值,并且有的注意点文档上也没说,现在我就说一下微信支付开发中需要注意的地方

项目配置

把实例项目中的一下文件拖到项目中

Control文件夹下的WXApiManager.h和WXApiManager.m
libWeChatSDK.a
WXApi.h
WXApiObject.h

桥接文件中添加引用

//微信支付
#import "WXApi.h"
#import "WXApiObject.h"
#import "WXApiManager.h"

项目配置选项卡InfoURL 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,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

支付步骤

支付总体上分为两步

  1. 获取prepayid(预付款ID)
  2. 根据prepayid发起支付

第一步获取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'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尚未注册 OLE DB 访问接口 SQLNCLI10 7043 错误

与链接服务器的测试连接失败。 执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo) ------------------------------程序位置: 在 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTy…

asterisk 支持 VP8 video编码 实现安卓的视频通话

1 :checkout Asterisk source code revision 373330 svn checkout -r 373330 http://svn.digium.com/svn/asterisk/trunk asterisk (下载最新asterisk版本) 2 &#xff1a;asterisk 上面需要打一个补丁支持 VP8 video编码 wget http://sipml5.googlecode.com/svn/trunk/aste…

【Flink SQL API体验数据湖格式之paimon】

前言 随着大数据技术的普及&#xff0c;数据仓库的部署方式也在发生着改变&#xff0c;之前在部署数据仓库项目时&#xff0c;首先想到的是选择国外哪家公司的产品&#xff0c;比如&#xff1a;数据存储会从Oracle、SqlServer中或者Mysql中选择&#xff0c;ETL工具会从Informa…

ai里为什么不能随意放大缩小_AI常见问题解答

1、在AI中,有没有和CD一样的调整文字间距的快捷键呀? 答:Alt+左右方向键移动箭头。 2、在AI中,如何像快速放大缩小编辑区域? 答:按住Alt滚动鼠标滚轮。 3、在AI中,如何设置圆角矩形的圆角大小? 答:点击圆角矩形工具,用鼠标点击画布,这里可以填。 4、在AI中,如何简单…

python归一化 增大差异_Python逻辑回归模型原理及实际案例应用

前言上面我们介绍了线性回归, 岭回归, Lasso回归, 今天我们来看看另外一种模型—"逻辑回归". 虽然它有"回归"一词, 但解决的却是分类问题目录1. 逻辑回归2. 优缺点及优化问题3. 实际案例应用4. 总结正文在前面所介绍的线性回归, 岭回归和Lasso回归这三种回…

上周热点回顾(6.17-6.23)

热点随笔&#xff1a; 各地IT薪资待遇讨论&#xff08;潇洒一回&#xff09; 这些年过上幸福生活的程序员&#xff08;上篇&#xff09;&#xff08;飞扬青云&#xff09; 一个线上运营着3000人的游戏&#xff0c;因为我不小心一个DROP DATABASE&#xff0c;全没了。 怎么办…

Boost学习之指针容器--pointer_container

有时,我们可能需要一个包含指针的容器.比如存放一些不可拷贝的对象或者想在容器里存放基类以实现多态.尽管我们可以直接定义存放指针的STL容器,不过这样并不方便,我们得处处小心,在清空或删除容器里的元素时我们要保证异常安全地回收指针所指向的对象,以防内存泄漏. 一个好的办…

libzdb 连接到mysql_MySQL 连接

MySQL 连接使用mysql二进制方式连接您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库。实例以下是从命令行中连接mysql服务器的简单实例&#xff1a;[roothost]# mysql -u root -pEnter password:******在登录成功后会出现 mysql> 命令提示窗口&#xff…

python ios 坐标点击_python点击鼠标获取坐标(Graphics)

使用Python进行图像编程&#xff0c;要使用到Graphics库。下面列举出较常用的代码from graphics import *#设置画布窗口名和尺寸win GraphWin(hehe, 666, 666)#关闭画布窗口win.getMouse()win.close()#画点pt Point(100, 100)pt.draw(win)#画圆cir Circle(Point(200, 200), …

C++ 11右值引用

C 11中引入的一个非常重要的概念就是右值引用。理解右值引用是学习“移动语义”&#xff08;move semantics&#xff09;的基础。而要理解右值引用&#xff0c;就必须先区分左值与右值。对左值和右值的一个最常见的误解是&#xff1a;等号左边的就是左值&#xff0c;等号右边的…

mysql dml ddl优先级_MYSQL入门操作和常规DML、DDL、DQL使用

刷新权限&#xff0c;将某些权限从硬盘刷新到内存中(修改root密码自带隐式刷新权限操作)mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)mysql>查看服务端口mysql> show variables like port;----------------------| Variable_name | Value |--------…

C语言中字符串如何转换为二进制、八进制、十进制、十六进制

在C语言某个程序当中需要把文本16进制转换成对应的16进制数&#xff0c;比如字符串"0x1a"转换成10进制的26&#xff0c;可以用以下函数来实现 相关函数: atof, atoi, atol, strtod, strtoul 表头文件: #include <stdlib.h> 定义函数: long int strtol(const…

python遍历循环中的遍历结构可以是什么_(一)Python入门-4控制语句:06for循环结构-遍历各种可迭代对象-range对象...

一&#xff1a;for循环和可迭代对象遍历for 循环通常用于可迭代对象的遍历。for 循环的语法格式如下&#xff1a;for 变量 in 可迭代对象&#xff1a;循环体语句可迭代对象&#xff1a;Python包含以下几种可迭代对象&#xff1a; 1. 序列。包含&#xff1a;字符串、列表、元组 …

C++11中的右值引用及move语义编程

C0x中加入了右值引用&#xff0c;和move函数。右值引用出现之前我们只能用const引用来关联临时对象&#xff08;右值&#xff09;&#xff08;造孽的VS可以用非const引用关联临时对象&#xff0c;请忽略VS&#xff09;&#xff0c;所以我们不能修临时对象的内容&#xff0c;右值…

IBatis 映射文件 sql 中大于、小于等符号转义

相信好多朋友在写配置文件的时候&#xff0c; 直接写 > 、<、>、< 编译不通过! 这些其实就是 xml 文体的特殊符号,在编写是需要转义&#xff0c;有两种方式处理&#xff0c;如下: 方法一 : 直接替换 <<>><><>&&amp;&apos…

python入侵数据库数据库_一个简单的Python访问Mysql数据库例子

2020/11/3操作记录搭建好Python的数据环境之后&#xff0c;接下来就是在Python代码中访问数据库我先在Navicat图形化界面创建一个数据库命名为pythontest&#xff0c;再在数据库中创建了一个表studentinfo有nid,nname,ngrade,nage四个字段&#xff0c;nid为主键递增。通过查询编…

r语言散点图_R语言 | 散点图入门:以声学元音图为例

R语言语言学与R语言的碰撞Xu & YangPhoneticSan学习参考Discovering Statistics Using RStatistics for Linguistics with RHow to Do Linguistics with RR in ActionAnalyzing Linguistic DataR Graphics Cookbook Recap可以使用plot( )函数进行基础的制图。调用ggplot2包…

oracle中如何创建dblink

当用户要跨本地数据库&#xff0c;访问另外一个数据库表中的数据时&#xff0c;本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。下面讲介绍如何在本地数据库中创建dblink. 创建dblink一般有两种方式&#x…

哪里的mysql性能监控_mysql性能监控工具Innotop简介及配置

# wget http://innotop.googlecode.com/files/innotop-1.9.0.tar.gz# tar -zxvf innotop-1.9.0.tar.gz# cd innotop-1.9.0安装INNOTOP工具非常简单&#xff0c;其是由PERL写的&#xff0c;当然需要PERL环境和相关的工具包。在安装之前先要确定你的系统安装了Time::HiRes,Term::…

python能不能爬数据库_python爬取数据后不能写入到数据库中

目标&#xff1a;去爬当当网某页内容中的书籍的名称&#xff0c;链接和评论数&#xff0c;然后写入数据库中pipelins内容如下&#xff1a;import pymysqlclass DangdangPipeline(object):def process_item(self, item, spider):conn pymysql.connect(host"127.0.0.1"…