iOS10ios机可以微信支付付吗

iOS中 最新微信支付/最全的微信支付教程具体解释 韩俊强的博客
时间: 21:40:33
&&&& 阅读:201
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
亲们, 首先让我们来看一下微信支付的流程吧.1. 注冊微信开放平台,创建应用获取appid,appSecret,申请支付功能,申请成功之后会返回一些參数.2. 下载微信支付sdk3. client请求订单,后台与微信后台交互。返回给client支付參数4. 调用微信client。由微信client和微信server打交道;5. client和服务端都会收到支付结果;(前台消息不可靠。我们须要去后台验证,假设后台没有收到支付通知。后台去微信server验证然后将结果返回给client)支付流程图(大家看一下支付流程).那么我们如今就開始写微信支付的demo了.开发步骤1:去微信开放平台注冊应用https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN&token=2c0fee9c43e1eb8f9febcc7cb73abf598e2d4011创建移动应用并成功之后会收到腾讯发来的邮件通过邮件我们能获得重要的參数:(1):AppID(2):微信支付商户号(4):前往商户平台完毕入驻(4):API秘钥(自己设置即可。注意一定要32位字母加数字的组合)记得保存好秘钥。以后要使用<img alt="技术分享" src="http://img.blog.csdn.net/21046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center"
/>有了这些參数后,我们就能够开发自己的项目了.接下来, 我们就新建一个微信project吧.创建好project以后呢, 我们去微信平台下载sdk链接: <img alt="技术分享" src="http://img.blog.csdn.net/33843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center"
/>下载好以后呢, 我们就開始集成SDK了把左边的SDK拉到project里面哦.大家会看到目录里面有集成SDK的步骤.第一步: 在info.plist加入例如以下代码这个大家都非常熟练拉第二步:加入须要的框架和依赖库 (ps: 官方文档没让加入libc++.tbd, 这点也是project报错的时候发现的...)剩下的事情, 我们仅仅须要依照官方文档来做即可了, 亲们.我们还回到上个页面.<img alt="技术分享" src="http://img.blog.csdn.net/16503?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center"
/>微信:APPID:wx920fde9f97d60569我们能够先使用这个APPID&& (ps: 这是同事的前公司的应用ID)1、项目设置APPID商户在微信开放平台申请开发APP应用后。微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID。这个我们依照文档做一下就能够了.2、注冊APPID商户APPproject中引入微信lib库和头文件。调用API前。须要先向微信注冊您的APPID。代码例如以下:[WXApi registerApp:@&wxd930ea5d5a258f4f];3、调起支付商户server生成支付订单,先调用【】生成预付单,获取到prepay_id后将參数再次签名传输给APP发起支付。下面是调起微信支付的关键代码:如今我们仅仅须要在控制器上加入一个button, 名字改成微信支付就能够了button事件:- (IBAction)weChatPayButtonAction:(id)sender
PayReq *request = [[PayReq alloc] init];
/** 商家向財付通申请的商家id */
request.partnerId = @&&;
/** 预支付订单 */
request.prepayId= @&c4c063c30&;
/** 商家依据財付通文档填写的数据和签名 */
request.package = @&Sign=WXPay&;
/** 随机串,防重发 */
request.nonceStr= @&lUu5qloVJV7rrJlr&;
/** 时间戳,防重发 */
request.timeStamp= ;
/** 商家依据微信开放平台文档对数据做的签名 */
request.sign= @&b640c1a6f4d34b8a9e&;
/*! @brief 发送请求到微信,等待微信返回onResp
* 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完毕后一定会调用onResp。支持下面类型
* SendAuthReq、SendMessageToWXReq、PayReq等。
* @param req 详细的发送请求。在调用函数后。请自己释放。
* @return 成功返回YES,失败返回NO。
[WXApi sendReq: request];
4、支付结果回调依照微信SDKSample。在类实现onResp函数,支付完毕后,微信APP会返回到商户APP并回调onResp函数,开发人员须要在该函数中接收通知,推断返回错误码。假设支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以client返回作为用户支付的结果,应以server端的接收的支付通知或查询API返回的结果为准。这是最后一步了, 我们在支付页面支付完毕以后呢要知道支付结果, 怎么做呢?首先, 在AppDelegate.m里面实现该方法- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary&NSString *,id& *)options
/*! @brief 处理微信通过URL启动App时传递的数据
* 须要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。
* @param url 微信启动第三方应用时传递过来的URL
* @param delegate
WXApiDelegate对象,用来接收微信触发的消息。
* @return 成功返回YES,失败返回NO。
return [WXApi handleOpenURL:url delegate:self];
}接下来我们须要遵守下协议最后一步, 就等支付结果出来以后回调一个函数了/*! @brief 发送一个sendReq后,收到微信的回应
* 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
* 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
* @param resp详细的回应内容。是自己主动释放的
- (void)onResp:(BaseResp *)resp
//支付返回结果,实际支付结果须要去微信server端查询
NSString *strMsg = [NSString stringWithFormat:@&支付结果&];
switch (resp.errCode) {
case WXSuccess:
strMsg = @&支付结果:成功!&;
NSLog(@&支付成功-PaySuccess。retcode = %d&, resp.errCode);
strMsg = [NSString stringWithFormat:@&支付结果:失败!retcode = %d, retstr = %@&, resp.errCode,resp.errStr];
NSLog(@&错误,retcode = %d, retstr = %@&, resp.errCode,resp.errStr);
开发人员交流群:这样, 我们就完毕了微信支付iOSclient的代码;Demo下载地址:https://github.com/XiaoHanGe/WeChatPay.gitps: 大家工作中写完以后要在真机上測试.
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:http://www.cnblogs.com/yxysuanfa/p/7281473.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!11被浏览2,365分享邀请回答53 条评论分享收藏感谢收起0添加评论分享收藏感谢收起写回答iOS接入微信支付(小白都能看懂的微信支付) - 简书
iOS接入微信支付(小白都能看懂的微信支付)
因为近期项目中需要接入微信支付功能,自己也爬了很多的坑,所以做了一下这边文章供大家学习参考,远离爬坑,文章主要讲到以下五部分:
一、 填写商户平台所需资料
二、 具体Demo代码
本文为本人学习记录笔记,如需转载,请注明出处
填写商户平台所需资料
一、填写经营信息
下图选择不同的类目,所需要上传的资料也是有所不同的,下图拿其它为例子
填写经营信息
二、填写商户信息(确认信息操作,此处省略)
三、填写对公帐号信息(此处省略)
以下是微信官方给出的交互步骤
商户系统和微信支付系统主要交互说明:
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【】。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。api参见本章节【】
步骤5:商户后台接收支付通知。api参见【】
步骤6:商户后台查询支付结果。,api参见【】
一、创建一个项目
二、下载微信终端SDK文件
SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个。
请前往“”下载最新SDK包
1.将下载好的SDK导入项目,如下图
Paste_Image.png
2.添加依赖库
Paste_Image.png
3.准备所需配置的数据
// 开放平台登录https://open.weixin.qq.com的开发者中心获取APPID
#define WX_APPID @"wxd21d890***2db4ca"
// 开放平台登录https://open.weixin.qq.com的开发者中心获取AppSecret。
#define WX_APPSecret @"fc32dfae9****eb5f77dddd4ea5"
// 微信支付商户号
#define MCH_ID
// 安全校验码(MD5)密钥,商户平台登录账户和密码登录http://pay.weixin.qq.com 平台设置的“API密钥”,为了安全,请设置为以数字和字母组成的32字符串。
#define WX_PartnerKey @"b5f9c901480*****0f4c6e659be0"
4.在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册AppId(如下图所示)
Paste_Image.png
配置好上述参数后就可以写代码了,具体可查看
PCH头文件: 在该文件配置好以下备注中要配置参数即可运行demo
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#pragma mark -
#pragma mark - 微信支付配置参数
// 开放平台登录https://open.weixin.qq.com的开发者中心获取APPID
#define WX_APPID @"wxd21d89033***b4ca"
// 开放平台登录https://open.weixin.qq.com的开发者中心获取AppSecret。
#define WX_APPSecret @"fc32dfae99bc67e****5f77dddd4ea5"
// 微信支付商户号
#define MCH_ID
@"1353***702"
// 安全校验码(MD5)密钥,商户平台登录账户和密码登录http://pay.weixin.qq.com
// 平台设置的“API密钥”,为了安全,请设置为以数字和字母组成的32字符串。
#define WX_PartnerKey @"B***C730EEA0F78D3B461"
#pragma mark -
#pragma mark - 统一下单请求参数键值
#define WXAPPID @"appid"
#define WXMCHID @"mch_id"
随机字符串
#define WXNONCESTR @"nonce_str"
#define WXSIGN @"sign"
#define WXBODY @"body"
商户订单号
#define WXOUTTRADENO @"out_trade_no"
#define WXTOTALFEE @"total_fee"
#define WXEQUIPMENTIP @"spbill_create_ip"
#define WXNOTIFYURL @"notify_url"
#define WXTRADETYPE @"trade_type"
预支付交易会话
#define WXPREPAYID @"prepay_id"
#pragma mark -
#pragma mark - 微信下单接口
微信统一下单接口连接
#define WXUNIFIEDORDERURL @"https://api.mch.weixin.qq.com/pay/unifiedorder"
#endif /* PrefixHeader_pch */
#import "AppDelegate.h"
#import "WXApiManager.h"
@interface AppDelegate ()
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// 注册微信
[WXApi registerApp:WX_APPID withDescription:@"demo 2.0"];
return YES;
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
[WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
** 微信支付回调管理类**
#import "WXApiManager.h"
@implementation WXApiManager
#pragma mark - 单粒
+(instancetype)sharedManager {
static dispatch_once_t onceT
static WXApiManager *
dispatch_once(&onceToken, ^{
instance = [[WXApiManager alloc] init];
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp
if([resp isKindOfClass:[PayResp class]]){
//支付返回结果,实际支付结果需要去微信服务器端查询
NSString *strM
switch (resp.errCode) {
case WXSuccess:
strMsg = @"支付结果:成功!";
NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
#import "ViewController.h"
#import "WXApiRequestHandler.h"
@interface ViewController ()
@implementation ViewController
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event
[WXApiRequestHandler jumpToBizPay];
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【】。
#import &Foundation/Foundation.h&
#import "WXApiObject.h"
@interface WXApiRequestHandler : NSObject
+ (NSString *)jumpToBizP
#import "WXApi.h"
#import "WXApiRequestHandler.h"
#import "WXApiManager.h"
#import "DataMD5.h"
#import "XMLDictionary.h"
#import &AFNetworking.h&
#pragma mark - 用于获取设备ip地址
#include &ifaddrs.h&
#include &arpa/inet.h&
@implementation WXApiRequestHandler
#pragma mark - 产生随机字符串
//生成随机数算法 ,随机字符串,不长于32位
//微信支付API接口协议中包含字段nonce_str,主要保证签名不可预测。
//我们推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串。
+ (NSString *)generateTradeNO {
static int kNumber = 15;
NSString *sourceStr = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSMutableString *resultStr = [[NSMutableString alloc] init];
srand函数是初始化随机数的种子,为接下来的rand函数调用做准备。
time(0)函数返回某一特定时间的小数值。
这条语句的意思就是初始化随机数种子,time函数是为了提高随机的质量(也就是减少重复)而使用的。
// srand(time(0)) 就是给这个算法一个启动种子,也就是算法的随机种子数,有这个数以后才可以产生随机数,用至今的秒数,初始化随机数种子。
// Srand是种下随机种子数,你每回种下的种子不一样,用Rand得到的随机数就不一样。为了每回种下一个不一样的种子,所以就选用Time(0),Time(0)是得到当前时时间值(因为每时每刻时间是不一样的了)。
srand(time(0)); // 此行代码有警告:
for (int i = 0; i & kN i++) {
unsigned index = rand() % [sourceStr length];
NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
[resultStr appendString:oneStr];
return resultS
#pragma mark - 获取设备ip地址
+ (NSString *)fetchIPAddress {
NSString *address = @"error";
struct ifaddrs *interfaces = NULL;
struct ifaddrs *temp_addr = NULL;
int success = 0;
// retrieve the current interfaces - returns 0 on success
success = getifaddrs(&interfaces);
if (success == 0) {
// Loop through linked list of interfaces
temp_addr =
while(temp_addr != NULL) {
if(temp_addr-&ifa_addr-&sa_family == AF_INET) {
// Check if interface is en0 which is the wifi connection on the iPhone
if([[NSString stringWithUTF8String:temp_addr-&ifa_name] isEqualToString:@"en0"]) {
// Get NSString from C String
address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr-&ifa_addr)-&sin_addr)];
temp_addr = temp_addr-&ifa_
// Free memory
freeifaddrs(interfaces);
#pragma mark - Public Methods
发起微信支付
+ (void)jumpToWxPay
#pragma mark 客户端操作时候的代码 \ 但是这些步骤应该放在服务端操作
//============================================================
// V3&V4支付流程实现
// 注意:参数配置请查看服务器端Demo
// 更新时间:日
//============================================================
// 交易类型
#define TRADE_TYPE @"APP"
// 交易结果通知网站此处用于测试,随意填写,正式使用时填写正确网站
#define NOTIFY_URL @"http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php"
// 交易价格1表示0.01元,10表示0.1元
#define PRICE @"1"
随机字符串变量 这里最好使用和安卓端一致的生成逻辑
NSString *nonce_str = [self generateTradeNO];
设备IP地址,请再wifi环境下测试,否则获取的ip地址为error,正确格式应该是8.8.8.8
NSString *addressIP = [self fetchIPAddress];
随机产生订单号用于测试,正式使用请换成你从自己服务器获取的订单号
NSString *orderno = [NSString stringWithFormat:@"%ld",time(0)];
获取SIGN签名
DataMD5 *data = [[DataMD5 alloc] initWithAppid:WX_APPID
mch_id:MCH_ID
nonce_str:nonce_str
partner_id:WX_PartnerKey
body:@"充值"
out_trade_no:orderno
total_fee:PRICE
spbill_create_ip:addressIP
notify_url:NOTIFY_URL
trade_type:TRADE_TYPE];
// 转换成xml字符串
NSString *string = [[data dic] XMLString];
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
//这里传入的xml字符串只是形似xml,但不是正确是xml格式,需要使用AF方法进行转义
session.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
[session.requestSerializer setValue:@"text/ charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[session.requestSerializer setValue:WXUNIFIEDORDERURL forHTTPHeaderField:@"SOAPAction"];
[session.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
[session POST:WXUNIFIEDORDERURL parameters:string progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id
_Nullable responseObject) {
输出XML数据
NSString *responseString = [[NSString alloc] initWithData:responseObject
encoding:NSUTF8StringEncoding] ;
将微信返回的xml数据解析转义成字典
NSDictionary *dic = [NSDictionary dictionaryWithXMLString:responseString];
// 判断返回的许可
if ([[dic objectForKey:@"result_code"] isEqualToString:@"SUCCESS"]
&&[[dic objectForKey:@"return_code"] isEqualToString:@"SUCCESS"] ) {
// 发起微信支付,设置参数
PayReq *request = [[PayReq alloc] init];
request.openID = [dic objectForKey:WXAPPID];
request.partnerId = [dic objectForKey:WXMCHID];
request.prepayId= [dic objectForKey:WXPREPAYID];
request.package = @"Sign=WXPay";
request.nonceStr= [dic objectForKey:WXNONCESTR];
// 将当前时间转化成时间戳
NSDate *datenow = [NSDate date];
NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
UInt32 timeStamp =[timeSp intValue];
request.timeStamp= timeS
// 签名加密
DataMD5 *md5 = [[DataMD5 alloc] init];
request.sign = [dic objectForKey:@"sign"];
request.sign=[md5 createMD5SingForPay:request.openID
partnerid:request.partnerId
prepayid:request.prepayId
package:request.package
noncestr:request.nonceStr
timestamp:request.timeStamp];
// 调用微信
[WXApi sendReq:request];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
#pragma mark
服务端操作微信支付 / 上述客户端操作可以忽略(仅供参考)没办法,靠后台还不如靠自己,先自己了解客户端实现支付的操作
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[WXTOTALFEE] = @"1";
params[WXEQUIPMENTIP] = [self fetchIPAddress];
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
[session POST:URLSTRING parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id
_Nullable responseObject) {
NSLog(@"responseObject = %@",responseObject);
// 判断返回的许可
if ([[responseObject objectForKey:@"result_code"] isEqualToString:@"SUCCESS"]
&&[[responseObject objectForKey:@"return_code"] isEqualToString:@"SUCCESS"] ) {
// 发起微信支付,设置参数
PayReq *request
= [[PayReq alloc] init];
request.openID
= [responseObject objectForKey:WXAPPID];
request.partnerId
= [responseObject objectForKey:WXMCHID];
request.prepayId
= [responseObject objectForKey:WXPREPAYID];
request.package
= @"Sign=WXPay";
request.nonceStr
= [responseObject objectForKey:WXNONCESTR];
request.timeStamp
= [[responseObject objectForKey:@"timestamp"] intValue];
request.sign
= [responseObject objectForKey:@"sign"];
// 调用微信支付
[WXApi sendReq:request];
// 显示错误信息
[LyonKeyWindow.rootViewController showHint:responseObject[@"err_code_des"]];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
以下皆是客户端的签名方法类
#import "DataMD5.h"
#import &CommonCrypto/CommonDigest.h&
@interface DataMD5()
@property (nonatomic,strong) NSString *
@property (nonatomic,strong) NSString *mch_
@property (nonatomic,strong) NSString *nonce_
@property (nonatomic,strong) NSString *
@property (nonatomic,strong) NSString *
@property (nonatomic,strong) NSString *out_trade_
@property (nonatomic,strong) NSString *total_
@property (nonatomic,strong) NSString *spbill_create_
@property (nonatomic,strong) NSString *notify_
@property (nonatomic,strong) NSString *trade_
@implementation DataMD5
#pragma makr - 懒加载
- (NSMutableDictionary *)dic
if (!_dic) {
_dic = [NSMutableDictionary dictionary];
#pragma mark - Config
-(instancetype)initWithAppid:(NSString *)appid_key
mch_id:(NSString *)mch_id_key
nonce_str:(NSString *)noce_str_key
partner_id:(NSString *)partner_id
body:(NSString *)body_key
out_trade_no :(NSString *)out_trade_no_key
total_fee:(NSString *)total_fee_key
spbill_create_ip:(NSString *)spbill_create_ip_key
notify_url:(NSString *)notify_url_key
trade_type:(NSString *)trade_type_key
if (self = [super init]) {
_nonce_str
= noce_str_
_partnerkey
= partner_
_out_trade_no
= out_trade_no_
_total_fee
= total_fee_
_spbill_create_ip = spbill_create_ip_
_notify_url
= notify_url_
_trade_type
= trade_type_
[self.dic setValue:_appid forKey:WXAPPID];
[self.dic setValue:_mch_id forKey:WXMCHID];
[self.dic setValue:_nonce_str forKey:WXNONCESTR];
[self.dic setValue:_body forKey:WXBODY];
[self.dic setValue:_out_trade_no forKey:WXOUTTRADENO];
[self.dic setValue:_total_fee forKey:WXTOTALFEE];
[self.dic setValue:_spbill_create_ip forKey:WXEQUIPMENTIP];
[self.dic setValue:_notify_url forKey:WXNOTIFYURL];
[self.dic setValue:_trade_type forKey:WXTRADETYPE];
[self createMd5Sign:self.dic];
//创建签名
//签名算法
//签名生成的通用步骤如下:
//第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
//特别注意以下重要规则:
//◆ 参数名ASCII码从小到大排序(字典序);
//◆ 如果参数的值为空不参与签名;
//◆ 参数名区分大小写;
//◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
//◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
//第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//key设置路径:微信商户平台(pay.weixin.qq.com)--&账户设置--&API安全--&密钥设置
-(void)createMd5Sign:(NSMutableDictionary*)dict
NSMutableString *contentString
=[NSMutableString string];
NSArray *keys = [dict allKeys];
//按字母顺序排序
NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
//拼接字符串
for (NSString *categoryId in sortedArray) {
![[dict objectForKey:categoryId] isEqualToString:@""]
&& ![[dict objectForKey:categoryId] isEqualToString:@"sign"]
&& ![[dict objectForKey:categoryId] isEqualToString:@"key"]
[contentString appendFormat:@"%@=%@&", categoryId, [dict objectForKey:categoryId]];
//添加商户密钥key字段
[contentString appendFormat:@"key=%@",_partnerkey];
NSLog(@"contentString = %@",contentString);
//MD5 获取Sign签名
NSString *md5Sign =[self md5:contentString];
[self.dic setValue:md5Sign forKey:@"sign"];
//创建发起支付时的sige签名
-(NSString *)createMD5SingForPay:(NSString *)appid_key partnerid:(NSString *)partnerid_key prepayid:(NSString *)prepayid_key package:(NSString *)package_key noncestr:(NSString *)noncestr_key timestamp:(UInt32)timestamp_key{
NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
[signParams setObject:appid_key forKey:@"appid"];
[signParams setObject:noncestr_key forKey:@"noncestr"];
[signParams setObject:package_key forKey:@"package"];
[signParams setObject:partnerid_key forKey:@"partnerid"];
[signParams setObject:prepayid_key forKey:@"prepayid"];
[signParams setObject:[NSString stringWithFormat:@"%u",(unsigned int)timestamp_key] forKey:@"timestamp"];
NSMutableString *contentString
=[NSMutableString string];
NSArray *keys = [signParams allKeys];
//按字母顺序排序
NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
//拼接字符串
for (NSString *categoryId in sortedArray) {
![[signParams objectForKey:categoryId] isEqualToString:@""]
&& ![[signParams objectForKey:categoryId] isEqualToString:@"sign"]
&& ![[signParams objectForKey:categoryId] isEqualToString:@"key"]
[contentString appendFormat:@"%@=%@&", categoryId, [signParams objectForKey:categoryId]];
//添加商户密钥key字段
#warning 注意此处一定要添加上商户密钥
[contentString appendFormat:@"key=%@", WX_PartnerKey];
NSString *result = [self md5:contentString];
NSLog(@"result = %@",result);
// MD5加密算法
-(NSString *) md5:(NSString *)str
const char *cStr = [str UTF8String];
//加密规则,因为逗比微信没有出微信支付demo,这里加密规则是参照安卓demo来得
unsigned char result[16]= "abcdef";
CC_MD5(cStr, (CC_LONG)strlen(cStr), result);
//这里的x是小写则产生的md5也是小写,x是大写则md5是大写,这里只能用大写,逗比微信的大小写验证很逗
return [NSString stringWithFormat:
@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
今日推荐 经常阅读博客是个好习惯推荐鸿洋CSDN的博客 微信支付相关文章 详细介绍Android开发集成微信支付(一) --- 仅客户端版详细介绍Android开发集成微信支付(二) --- 完整版本 引言 本篇文章目的在于缩短集成微信支付的时间,让您更快的接入微信支付,躲...
前言:本篇文章目的在于梳理知识,巩固思想,学习总结。有什么好的建议,都可以留言。互相促进!总观,微信支付,也没心思,好好看文档。文档微微有些乱。感觉,微信demo,内部功能都集成到一块了,不好查找。终于,在各种坑下,仔细看了一遍文档,默默的弄完了。会用到的网址如下:微信开放...
自己总结的微信支付宝支付流程和注意点: 准备工作: 需要公司的营业执照,税务信息,等老板的身份证信息等,我记得,用这些材料,去支付宝注册一个商家账户(审核周期大概5个工作日),或者微信的开发者账号(审核周期大概5个工作日,300元费用),微信的话,需要你的app已经上架有了...
微信支付文档 1.微信支付简介 a)功能简介 b)支付账户 c)支付方式 d)账号测试 2.JS API支付接口 a)支付场景 b)功能交互 c)获取当前微信版本号 d)显示微信安全支付标题 e)JS API支付接口(getBrandWCPayRequest)定义 f)订单...
准备工作: 需要公司的营业执照,税务信息,等老板的身份证信息等,我记得,用这些材料,去支付宝注册一个商家账户(审核周期大概5个工作日),或者微信的开发者账号(审核周期大概5个工作日,300元费用),微信的话,需要你的app已经上架有了APPID,才能开通;大概也是5个工作日...
突然想起前一段时间还嚷嚷着“才不要谈恋爱,要安分守己的当一条宇宙无敌单身哈士奇就好啦”的自己觉得甚是好笑。比起酸涩的青杨梅还是甜甜的哈密瓜更能让我开心。奇怪!我也不是情窦初开的小可爱,最近却总能看到或自己脑子里冒出一些沾满蜂蜜酱的文字,腻歪歪的总是在眼帘晃来晃去。。更早一些...
请你爱我之前先爱你自己 爱我的同时也爱着你自己 你若不爱你自己 你便无法来爱我 这是爱的法则 因为 你不可能给出 你没有的东西 你的爱 只能经由你而流向我 若你是干涸的 我便不能被你滋养 若因滋养我而干涸你。本质上无法成立 因为 剥削你并不能让我得到滋养 把你碗里的饭倒进我...
我肚子会饿,可我仍然不想吃馍。不喜欢吃馍,一是因为我的饮食理念,二是因为我时常的牙龈出血。
1.socket类 根据前一篇博客《理解网络编程》所述,面向网络编程需要获取套接字(socket)信息;c#中socket类为网络通信提供了一套丰富的方法和属性,下图展示了TCP客户端与服务端建立通信的连接过程。相关编程思路将以此展开。 2.TCP服务端 2.1.socke...
人生若如初,待一人与归。 写给走进25岁的罗珍玮。收好所有的悲伤,好好的努力的快乐的过日子。 遇见你,是2017年的6月,阳光正好,微风和煦,一切都是恰好的刚刚好。 你是我24年里第一个不敢吵架不敢不搭理的人,你也是我24年里第一个觉得我不靠谱的人,你更是我可以把整个朋友圈...}

我要回帖

更多关于 苹果6可以微信付款吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信