iOS-支付宝微信支付

2024-06-08 17:18
文章标签 微信 ios 支付 支付宝

本文主要是介绍iOS-支付宝微信支付,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 微信支付

1.所需要的材料

  • 微信SDK
    微信SDK
  • 在微信开放平台上面申请得到的参数

    // 应用的APPID
    kWXAppID @"wxc82cXXXXXXXX"
    // AppSecret
    kWXAppSecret @"7f47bfe47b84XXXXXXXXXXXx"
    //商户号
    kWXMchID @"1242XXXXXX"
    //商户API密钥
    kWXPartnerID @"n1LeHtXUV9ZuPp156mcmXXXXXXXXX"
    //支付结果回调页面
    kWXNotifyURL @"http://XXXXXXXXX"

1.2 微信支付工程配置

// 需要的系统依赖

SystemConfiguration.framework
libz.dylib
libsqlite3.0.dylib
libc++.dylib

2.调起微信客户端代码

    [WXApi registerApp:weichat_appid];//调起微信支付PayReq* req             = [[PayReq alloc] init];req.partnerId           = item.partnerid;req.prepayId            = item.prepayid;req.nonceStr            = item.noncestr;req.timeStamp           = [item.timestamp intValue];req.package             = item.package;req.sign                = item.sign;[WXApi sendReq:req];

问: 微信支付怎么支付?
答: 其实就是上面的代码.

  • 创建一个PayReq对象req, 然后[WXApi sendReq:req]; 就这么简单.
    难就难在,怎么得到PayReq对象所需要的那些值,一共六个值.
    而这六个值其他的值好说,就两个:prepayId和sign比较麻烦.
    • 获取prepayId(预支付订单)是需要发请求给微信(统一下单),然后微信返回结果给我们的.
    • 而sign前面的话,各种参数柔和在一起,MD5一下,也比较烦.

3.拿到prepayId

怎么拿?
官方文档---->统一下单
就是发一个请求给微信,然后微信返回prepayId给你.官方要求统一下单要放在我们的服务器做.--------这是个好事情!!!!!!!!!!!
服务器端完成的!!!!哈哈哈哈,其实放在服务器端做的话,接入微信支付就没什么好说的了.

  • 放在服务器端我们的步奏
    • 拿到商品id 和 商品名称 商品价格发给我们的服务器,然后服务器端返回给我们调用微信需要的PayReq对象req的所有参数
    • 我们调起微信(没错现实当中就是这样的简单,我们发个请求,服务端给我需要的所有参数,然后我们调起微信就ok, 烦不了~)
      统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。
      其实不用服务端,我们也可以完成. 就是我们自己发请求然后拿到prepayId,我只是说我们自己可以做,但是现实中我们应当放在服务端,官方文档就是这么要求,这样我们省了好多事的好不,接入微信就很简单了.
      但是为了演示效果,而又没有现成的服务器接口给我们.所以Demo中,我是将说有过程写在我们本地.

放在我们本地的做法
1.我们想这个接口:@"https://api.mch.weixin.qq.com/pay/unifiedorder" 发一个post请求

2.参数
aped //开放平台appid
mch_id //商户号
nonce_str//随机串
trade_type //支付类型,固定为APP
body //订单描述,展示给用户, 就是商品名
notify_url //支付结果异步通知, 就是kWXNotifyURL
out_trade_no //商户订单号 我们自己设定的订单号
spbill_create_ip // //发器支付的机器ip
total_fee //订单金额,单位为分

sign // 签名, 就是上面那些参数按照字母顺序拼接成一个字符串,然后再拼接一个kWXPartnerID . 有关sign(签名)的生成可以参考官方文档,或者看下面关于sign的"通俗说法",或者直接看Demo

4.partnerId 商家向财付通申请的商家id

// 商家向财付通申请的商家id 这个不用说, 自己去微信开放平台上拿

5.nonceStr 随机串

/***  生成随机字符串**  @param kNumber 订单号的长度*/
- (NSString *)generateRomNumWithNumber: (NSInteger)kNumber
{NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";NSMutableString *resultStr = [[NSMutableString alloc] init];srand((unsigned int)time(0));for (NSInteger i = 0; i < kNumber; i++){unsigned index = rand() % [sourceStr length];NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];[resultStr appendString:oneStr];}return resultStr;
}

6.timeStamp 时间戳

time_t now;
time(&now);
time_stamp  = [NSString stringWithFormat:@"%ld", now];

7.package 商家根据财付通文档填写的数据和签名

这个是个死值 Sign=WXPay
官方文档说:暂填写固定值Sign=WXPay

8.sign

官方文档这么说的
签名算法
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。


通俗的说:
1.就是拿到PayReq对象的其他5个值,参数名ASCII码从小到大排序(字典序),然后
a字母顺序第一个appid,就是第一,然后后面的同样按照字母先后顺序一个&一个那么拼接成一个字符串.

str1 = @"appid=wxd930ea5d5a258f4f&package=Sign=WXPay......";

2.得到上面的字符串以后了再在后的字符串后面拼接上key
// kWXPartnerID @"n1LeHtXUV9ZuPp156mcmXXXXXXXXX"
str2 = [str1 appendFormat:@"key=%@", kWXPartnerID];

然后对str2 MD5加密一下,就得到了sign了.

如果是按照官方文档"统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。"这样,上面的这些所有参数你都不用管,你要做的只是,拿到你们APP里面商品的价格,商品名什么的发给后台,然后后台就会把你需要的这些所有参数给你,然后你拿着这些参数调起微信就ok!

二.支付宝支付

1.需要的材料

支付宝SDK
下载下来解压文件如图


Snip20160709_15.png

// 解压iOS那个zip


Snip20160709_17.png

// 得到如图


Snip20160709_18.png

// 我们需要的文件有如图


Snip20160709_19.png

// 在我们工程里面新建一个文件夹Alipay将上面我们需要的文件放在文件Alipay下


Snip20160709_20.png

// 支付宝需要的系统库

"1"CFNetwork.framework
"2"CoreMotion.framework
"3"“SystemConfiguration.framework”,
"4"“CoreGraphics.Framework”、
"5"“CoreTelephony.framework”
"6"“libz.dylib”
"7"libc++.dylib
"8"QuartzCore.framework
"9"CoreText.framework

// 在支付宝上申请得到的参数

#ifndef __OPTIMIZE__
#define kPayNotifyURL @"http://WWW.XXXX.XXXXXXXXX"
#else
#define kPayNotifyURL @"https://WWW.FFFF.XXXXXXX"
#endif
#define kPrivateKey @"SDGSFHGDFHGSVF$%#$RFFDSFASFASFASFSDFASDFASDCVCVZXVZXCVZXCVZXCVXCVZXCVGQWY%##$T@!RXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"// 
#define kSeller @"20XXXXXXXXXXXXXX"
#define kPartner @"20XXXXXXXXXXXXX"

kPayNotifyURL
kPrivateKey
kSeller
kPartner

2.支付实现

我是用WTPayManager统一管理微信和支付宝支付的
在WTPayManager里包含

import <AlipaySDK/AlipaySDK.h>

调用支付宝代码

+ (void)aliPayWithOrderItem:(WTPayOrderItem *)orderItem
{/**商户的唯一的parnter和seller。*签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。*//**生成订单信息及签名*///将商品信息赋予AlixPayOrder的成员变量Order *order = [[Order alloc] init];order.partner = kPartner;order.sellerID = kSeller;order.outTradeNO = orderItem.orderOutTradeNO;//订单ID(由商家自行制定)order.subject = orderItem.orderName;//商品标题order.body = orderItem.orderBody; //商品描述order.totalFee = orderItem.orderPrice; //商品价格order.notifyURL = kPayNotifyURL;order.service = @"mobile.securitypay.pay";//接口名称,固定为mobile.securitypay.pay。order.paymentType = @"1";order.inputCharset = @"utf-8";order.itBPay = @"30m";order.showURL = @"m.alipay.com";//应用注册scheme,在AlixPayDemo-Info.plist定义URL typesNSString *appScheme = @"XXXXXXXXXX";//将商品信息拼接成字符串NSString *orderSpec = [order description];NSLog(@"orderSpec = %@",orderSpec);//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncodeid<DataSigner> signer = CreateRSADataSigner(kPrivateKey);NSString *signedString = [signer signString:orderSpec];//将签名成功字符串格式化为订单字符串,请严格按照该格式//    __weak typeof(self) weakSelf = self;NSString *orderString = nil;if (signedString != nil) {orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderSpec, signedString, @"RSA"];[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {NSLog(@"resultDic=%@",resultDic);//[weakSelf handleAlipayResponse:resultDic];}];}else{//[self handleAlipayResponse:nil];}}

// 支付宝支付相对微信来说简单些

拿到
kPayNotifyURL
kPrivateKey
kSeller
kPartner
这几个参数
加上我们的商品价格,名称,商品订单,本地加个密,往支付宝一推,就ok了.

集成支付宝openssl可能会出现
导入SDK或者调用支付宝失败的情况
1.0 openssl/asn1.h file not found
点击这里答案,感谢-----荏苒少年

三.统一配置

info.plist // 文件下加入这个

<key>LSApplicationQueriesSchemes</key><array><string>sinaweibohd</string><string>sinaweibo</string><string>sinaweibosso</string><string>weibosdk</string><string>weibosdk2.5</string><string>mqqapi</string><string>mqq</string><string>mqqOpensdkSSoLogin</string><string>mqqconnect</string><string>mqqopensdkdataline</string><string>mqqopensdkgrouptribeshare</string><string>mqqopensdkfriend</string><string>mqqopensdkapi</string><string>mqqopensdkapiV2</string><string>mqqopensdkapiV3</string><string>mqzoneopensdk</string><string>wtloginmqq</string><string>wtloginmqq2</string><string>mqqwpa</string><string>mqzone</string><string>mqzonev2</string><string>mqzoneshare</string><string>wtloginqzone</string><string>mqzonewx</string><string>mqzoneopensdkapiV2</string><string>mqzoneopensdkapi19</string><string>mqzoneopensdkapi</string><string>mqzoneopensdk</string><string>alipay</string><string>alipayshare</string></array><key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>

Snip20160709_21.png

// PCH


Snip20160709_22.png

// -ObjC


Snip20160709_23.png

// URL Schemes


Snip20160709_24.png

四. WTPayManager 代码实现

WTPayManager.h

//
//  WTPayManager.h
//  WT_Pay
//
//  Created by Mac on 16/7/5.
//  Copyright © 2016年 wutong. All rights reserved.
//#import <Foundation/Foundation.h>
#import <AlipaySDK/AlipaySDK.h>
#import "WXApi.h"@interface WTPayOrderItem : NSObject/**商品名称*/
@property (nonatomic, strong)NSString * orderName;/**
商品价格支付宝的单位是元微信的单位是分
*/
@property (nonatomic, strong)NSString * orderPrice;/**
订单号
*/
@property (nonatomic, strong)NSString * orderOutTradeNO;/**商品描述*/
@property (nonatomic, strong)NSString * orderBody;@endtypedef NS_ENUM(NSInteger, WTPayType) {WTPayTypeAli = 0,   // 支付宝支付WTPayTypeWeixin  // 微信支付
};typedef NS_ENUM(NSInteger, WTPayAilPayResultType) {WTPayAilPayResultTypeSucess = 9000,   // 支付成功WTPayAilPayResultTypeCancel = 6001// 用户取消
};typedef void(^WTPayResultBlock)(NSDictionary * payResult, NSString * error);
@interface WTPayManager : NSObject<WXApiDelegate>+ (instancetype)shareWTPayManager;
- (void)handleAlipayResponse:(NSDictionary *)resultDic;+ (void)wtPayOrderItem:(WTPayOrderItem *)orderItem payType:(WTPayType)type result:(WTPayResultBlock)result;
@end

WTPayManager.m

//
//  WTPayManager.m
//  WT_Pay
//
//  Created by Mac on 16/7/5.
//  Copyright © 2016年 wutong. All rights reserved.
//#import "WTPayManager.h"
#import "payRequsestHandler.h"
#import "Order.h"
#import "DataSigner.h"@interface WTPayManager ()<NSCopying>
@property (nonatomic, copy)WTPayResultBlock result;
@end@implementation WTPayManager+ (void)initialize
{[WTPayManager shareWTPayManager];
}static WTPayManager * _instance;+ (instancetype)allocWithZone:(struct _NSZone *)zone
{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_instance = [super allocWithZone:zone];[_instance setRegisterApps];});return _instance;
}+ (instancetype)shareWTPayManager
{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_instance = [[self alloc]init];[_instance setRegisterApps];});return _instance;
}- (id)copyWithZone:(nullable NSZone *)zone
{return _instance;
}// 注册appid
- (void)setRegisterApps
{    // 微信注册[WXApi registerApp:kWXAppID];
}+ (void)wtPayOrderItem:(WTPayOrderItem *)orderItem payType:(WTPayType)type result:(WTPayResultBlock)result
{[WTPayManager shareWTPayManager].result = result;if (type == WTPayTypeWeixin) {[WTPayManager weixinPayWithOrderItem:orderItem];}else if (type == WTPayTypeAli){[WTPayManager aliPayWithOrderItem:orderItem];}
}
+ (void)aliPayWithOrderItem:(WTPayOrderItem *)orderItem
{/**商户的唯一的parnter和seller。*签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。*//**生成订单信息及签名*///将商品信息赋予AlixPayOrder的成员变量Order *order = [[Order alloc] init];order.partner = kPartner;order.sellerID = kSeller;order.outTradeNO = orderItem.orderOutTradeNO;//订单ID(由商家自行制定)order.subject = orderItem.orderName;//商品标题order.body = orderItem.orderBody; //商品描述order.totalFee = orderItem.orderPrice; //商品价格order.notifyURL = kPayNotifyURL;order.service = @"mobile.securitypay.pay";order.paymentType = @"1";order.inputCharset = @"utf-8";order.itBPay = @"30m";order.showURL = @"m.alipay.com";//应用注册scheme,在AlixPayDemo-Info.plist定义URL typesNSString *appScheme = @"mralipaysdk";//将商品信息拼接成字符串NSString *orderSpec = [order description];NSLog(@"orderSpec = %@",orderSpec);//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncodeid<DataSigner> signer = CreateRSADataSigner(kPrivateKey);NSString *signedString = [signer signString:orderSpec];//将签名成功字符串格式化为订单字符串,请严格按照该格式//    __weak typeof(self) weakSelf = self;NSString *orderString = nil;if (signedString != nil) {orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderSpec, signedString, @"RSA"];[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {NSLog(@"resultDic=%@",resultDic);//[weakSelf handleAlipayResponse:resultDic];}];}else{//[self handleAlipayResponse:nil];}}- (void)handleAlipayResponse:(NSDictionary *)resultDic
{//    resultDic;NSLog(@"%@", resultDic);if ([resultDic[@"resultStatus"] integerValue] != WTPayAilPayResultTypeSucess) {NSString * errorStr;errorStr = resultDic[@"memo"] ? resultDic[@"memo"] : @"支付失败";self.result(nil, errorStr);}else{NSDictionary * response = @{@"result":@"支付宝支付成功!"};self.result(response,nil);}}+ (void)weixinPayWithOrderItem:(WTPayOrderItem *)orderItem
{payRequsestHandler *payObj = [payRequsestHandler sharedInstance];//1. 拿到prepayId 和 sign, 其他参数写在外面都行NSDictionary * dict = [payObj sendPay:orderItem.orderName orderPrice:orderItem.orderPrice outTradeNo:orderItem.orderOutTradeNO];// 2.调起微信支付if(dict != nil){NSMutableString *retcode = [dict objectForKey:@"retcode"];if (retcode.intValue == 0){NSMutableString *stamp  = [dict objectForKey:@"timestamp"];//调起微信支付PayReq* req             = [[PayReq alloc] init];req.partnerId           = [dict objectForKey:@"partnerid"];req.prepayId            = [dict objectForKey:@"prepayid"];req.nonceStr            = [dict objectForKey:@"noncestr"];req.timeStamp           = stamp.intValue;req.package             = [dict objectForKey:@"package"];req.sign                = [dict objectForKey:@"sign"];BOOL success = [WXApi sendReq:req];if(!success){NSLog(@"调微信失败");}return;}else{NSLog(@"%@",[dict objectForKey:@"retmsg"]);}}else{NSLog(@"服务器返回错误");}}-(void)onResp:(BaseResp*)resp{if ([resp isKindOfClass:[PayResp class]]){PayResp*response=(PayResp*)resp;if (response.errCode == WXSuccess) {NSDictionary * response = @{@"result":@"微信支付成功!"};self.result(response,nil);}else{NSLog(@"支付失败,retcode=%d",resp.errCode);self.result(nil,@"支付失败");}}
}@end@implementation WTPayOrderItem
@end

这篇关于iOS-支付宝微信支付的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1042814

相关文章

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

Redis迷你版微信抢红包实战

《Redis迷你版微信抢红包实战》本文主要介绍了Redis迷你版微信抢红包实战... 目录1 思路分析1.1hCckRX 流程1.2 注意点①拆红包:二倍均值算法②发红包:list③抢红包&记录:hset2 代码实现2.1 拆红包splitRedPacket2.2 发红包sendRedPacket2.3 抢

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片