




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】支付宝,微信支付集成
首先要弄个支付相关的类@interface
MOIPayModel
:
NSObject
//channel
:1:支付宝
2:微信
@property
NSInteger
channel;
//支付金额
(分)
@property
float
price;
@property
(strong
,
nonatomic)
NSString
*productName;
//商品标题
@property
(strong
,
nonatomic)
NSString
*productDescription;
//商品描述
//后台系统订单ID
@property
(nonatomic)
long
long
orderId;
//支付宝属性
/**
PID
*/
@property
(strong
,
nonatomic)
NSString
*partner;
/**
收款支付宝账号
*/
@property
(strong
,
nonatomic)
NSString
*seller;
/**
私钥
*/
@property
(strong
,
nonatomic)
NSString
*privateKey;
/**
返回URL
*/
@property
(strong
,
nonatomic)
NSString
*notifyURL;
//微信支付属性
/**
商户ID
*/
@property
(nonatomic,
retain)
NSString
*partnerId;
/**
预支付ID
*/
@property
(nonatomic,
retain)
NSString
*prepayId;
/**
商户密钥
*/
@property
(nonatomic,
retain)
NSString
*spKey;
@end先说下支付宝的支付流程吧,其实支付宝的并不需要什么动态信息,可以把所有的信息都写在客户端里,不过这样很不安全,所以还是要向自己的服务器请求相关信息。_MOIPayModel.notifyURL
=
@"返回URL";
_MOIPayModel.partner
=
@"PID";
_MOIPayModel.seller
=
@"收款支付宝账号";
_MOIPayModel.privateKey
=
@"商户密钥";typedef
void(^MOIPayOderUtilCompletion)(MOIPayModel
*payModel
,
id
message);
typedef
void(^MOIPayOderUtilFailed)(MOIPayModel
*payModel
,
id
message);
static
NSString
*appScheme
=
@"调用支付的app注册在info.plist中的scheme";
-(void)goToAliPayFor:(MOIPayModel
*)_payModel
completion:(MOIPayOderUtilCompletion)_payCompletion
failed:(MOIPayOderUtilFailed)_payFailed{
if
(!_payModel.partner
||
!_payModel.seller
||
!_payMductName
||
!_payModel.notifyURL)
{
NSLog(@"缺少信息,支付将失败");
}
//将商品信息赋予AlixPayOrder的成员变量
Order
*order
=
[[Order
alloc]
init];
order.partner
=
_payModel.partner;
order.seller
=
_payModel.seller;
order.tradeNO
=
_payModel.orderNO;
//订单ID(由商家自行制定)
ductName
=
_payMductName;
//商品标题
ductDescription
=
_payMductDescription;
//商品描述
order.amount
=
[NSString
stringWithFormat:@"%g",_payModel.price/100.f];
//商品价格
order.notifyURL
=
_payModel.notifyURL;
//回调URL
order.service
=
@"mobile.securitypay.pay";
order.paymentType
=
@"1";
order.inputCharset
=
@"utf-8";
order.itBPay
=
@"30m";
order.showUrl
=
@"";
//将商品信息拼接成字符串
NSString
*orderSpec
=
[order
description];
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
id<DataSigner>
signer
=
CreateRSADataSigner(_payModel.privateKey);
NSString
*signedString
=
[signer
signString:orderSpec];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString
*orderString
=
nil;
if
(signedString
!=
nil)
{
orderString
=
[NSString
stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderSpec,
signedString,
@"RSA"];
[[AlipaySDK
defaultService]
payOrder:orderString
fromScheme:appScheme
callback:^(NSDictionary
*resultDic)
{
int
resultStatus
=
[resultDic
intValueForKey:@"resultStatus"];
switch
(resultStatus)
{
case
9000:
_payCompletion(nil,nil);
break;
default:
{
_payFailed(nil,([resultDic
safeObjectForKey:@"memo"]
?
:
@"支付中断"));
}
break;
}
}];
}else{
_payFailed(nil,@"支付中断");
}
}微信支付流程需要先拿到一个‘预支付id’,通常这个id是由后台请求微信服务器得到的,具体的接口什么的我就不写了,毕竟不是客户端的事情。最后需要拿到几个重要信息_MOIPayModel.partnerId
=
@"商户ID"
_MOIPayModel.prepayId
=
@"预支付ID";
_MOIPayModel.spKey
=
@"商户密钥";这三个重要信息都有了把信息拼起来创建一个SIGN签名就可以向微信发请求了PayReq
*request
=
[[PayReq
alloc]
init];
request.partnerId
=
_payModel.partnerId;
request.prepayId
=
_payModel.prepayId;
request.package
=
@"Sign=WXPay";
//随机串
request.nonceStr
=
[self
ret32bitString];
NSDate
*datenow
=
[NSDate
date];
NSString
*timeSp
=
[NSString
stringWithFormat:@"%ld",
(long)[datenow
timeIntervalSince1970]];
UInt32
timeStamp
=[timeSp
intValue];
request.timeStamp=
timeStamp;
NSDictionary
*_dic
=
@{@"appid":kWXAppID,
@"partnerid":request.partnerId,
@"prepayid":request.prepayId,
@"package":request.package,
@"noncestr":request.nonceStr,
@"timestamp":@(request.timeStamp)//时间戳
};
request.sign
=
[self
createMd5Sign:[_dic
mutableCopy]
spKey:_payModel.spKey];
if
(![WXApi
sendReq:request])
{
NSLog(@"发起支付失败");
}回调结果-(void)
onResp:(BaseResp*)resp;
{
if
([resp
isKindOfClass:[PayResp
class]]){
PayResp*response=(PayResp*)resp;
switch(response.errCode){
case
WXSuccess:
NSLog(@"微信支付成功");
break;
case
WXErrCodeUserCancel:
NSLog(@"交易取消");
break;
default:
NSLog(@"支付失败");
break;
}
}
}用到的一些方法//创建sign签名
-
(NSString
*)createMd5Sign:(NSMutableDictionary
*)dict
spKey:(NSString
*)_spKey
{
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)
{
if
(
![categoryId
isEqualToString:@"sign"]
&&
![categoryId
isEqualToString:@"key"]
)
{
[contentString
appendFormat:@"%@=%@&",
categoryId,
[dict
objectForKey:categoryId]];
}
}
//添加key字段
[contentString
appendFormat:@"key=%@",
_spKey];
//得到MD5
sign签名
NSString
*md5Sign
=[self
md5HexDigest:contentString];
return
[md5Sign
uppercaseString];
}
//MD5
-
(NSString
*)md5HexDigest:(NSString*)password
{
if
(!password
||
![password
isKindOfClass:[NSString
class]]
||
password.length
==
0)
{
return
@"";
}
const
char
*original_str
=
[password
UTF8String];
un
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中学加强品牌学科建设实施方案
- 办公活动策划与执行细节方案
- 企业信息安全与防护作业指导书
- 2025福建省电力电网有限公司高校毕业生(第一批)招聘748人笔试参考题库附带答案详解
- 居间劳务报酬合同
- 2025内蒙古交通集团有限公司社会化招聘100人笔试参考题库附带答案详解
- 2025年上半年安顺平坝县公安局招考工勤人员易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年安徽黄山市屯溪区事业单位招聘工作人员29人笔试易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年安徽鑫时代工程项目管理限公司公开招聘工作人员及专业技术储备人员若干人易考易错模拟试题(共500题)试卷后附参考答案
- 2024年地震电磁辐射观测仪项目资金筹措计划书代可行性研究报告
- 学校教育信息化管理规章制度汇编
- 机械设备供货安装及售后服务方案(通用)
- 社区矫正人员工作手册
- 妊娠期糖尿病饮食指导
- 执行难问题现状成因及解决对策
- 光伏现代农业大棚现状与分析
- 1概论-3(建筑构造)ppt课件
- 电缆敷设施工方案及安全措施范文
- 卡通手绘可爱小兔子PPT模板
- 军事地形学地形图基本知识
- 小儿体格检查(课堂PPT)
评论
0/150
提交评论