每日更新关注:http://weibo.com/hanjunqiang 新浪微博!
亲们, 首先让我们来看一下微信支付的流程吧.
1. 注册微信开放平台,创建应用获取appid,appSecret,申请支付功能,申请成功之后会返回一些参数.
2. 下载微信支付sdk
3. 客户端请求订单,后台与微信后台交互,返回给客户端支付参数
4. 调用微信客户端,由微信客户端和微信服务器打交道;
5. 客户端和服务端都会收到支付结果;(前台消息不可靠,我们需要去后台验证,如果后台没有收到支付通知,后台去微信服务器验证然后将结果返回给客户端)
支付流程图(大家看一下支付流程).
那么我们现在就开始写微信支付的demo了.
开发步骤
1:去微信开放平台注册应用
创建移动应用并成功之后会收到腾讯发来的邮件
通过邮件我们能获得重要的参数:
(1):AppID
(2):微信支付商户号
(4):前往商户平台完成入驻
(4):API秘钥(自己设置即可,注意一定要32位字母加数字的组合)记得保存好秘钥,以后要使用
有了这些参数后,我们就可以开发自己的项目了.
接下来, 我们就新建一个微信工程吧.
创建好工程以后呢, 我们去微信平台下载sdk
链接: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5#
下载好以后呢, 我们就开始集成SDK了
把左边的SDK拉到工程里面哦.
大家会看到文件夹里面有集成SDK的步骤.
第一步: 在info.plist添加如下代码
每日更新关注:http://weibo.com/hanjunqiang 新浪微博!
第二步:
添加需要的框架和依赖库 (ps: 官方文档没让添加libc++.tbd, 这点也是工程报错的时候发现的…)
剩下的事情, 我们只需要按照官方文档来做就行了, 亲们.
我们还回到上个页面.
微信:APPID:wx920fde9f97d60569
每日更新关注:http://weibo.com/hanjunqiang 新浪微博!
我们可以先使用这个APPID (ps: 这是同事的前公司的应用ID)
1、项目设置APPID
商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID。
这个我们按照文档做一下就可以了.
2、注册APPID
商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:
[WXApi registerApp:@”wxd930ea5d5a258f4f];
3、调起支付
商户服务器生成支付订单,先调用【统一下单API】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:
现在我们只需要在控制器上添加一个button, 名字改成微信支付就可以了
button事件:
- - (IBAction)weChatPayButtonAction:(id)sender
- {
- PayReq *request = [[PayReq alloc] init];
- /** 商家向财付通申请的商家id */
- request.partnerId = @”1220277201”;
- /** 预支付订单 */
- request.prepayId= @”82010380001603250865be9c4c063c30”;
- /** 商家根据财付通文档填写的数据和签名 */
- request.package = @”Sign=WXPay”;
- /** 随机串,防重发 */
- request.nonceStr= @”lUu5qloVJV7rrJlr”;
- /** 时间戳,防重发 */
- request.timeStamp= 1458893985;
- /** 商家根据微信开放平台文档对数据做的签名 */
- request.sign= @”b640c1a4565b476db096f4d34b8a9e71960b0123”;
- /*! @brief 发送请求到微信,等待微信返回onResp
- *
- * 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持以下类型
- * SendAuthReq、SendMessageToWXReq、PayReq等。
- * @param req 具体的发送请求,在调用函数后,请自己释放。
- * @return 成功返回YES,失败返回NO。
- */
- [WXApi sendReq: request];
- }
- (IBAction)weChatPayButtonAction:(id)sender
{
PayReq *request = [[PayReq alloc] init];
/** 商家向财付通申请的商家id */
request.partnerId = @"1220277201";
/** 预支付订单 */
request.prepayId= @"82010380001603250865be9c4c063c30";
/** 商家根据财付通文档填写的数据和签名 */
request.package = @"Sign=WXPay";
/** 随机串,防重发 */
request.nonceStr= @"lUu5qloVJV7rrJlr";
/** 时间戳,防重发 */
request.timeStamp= 1458893985;
/** 商家根据微信开放平台文档对数据做的签名 */
request.sign= @"b640c1a4565b476db096f4d34b8a9e71960b0123";
/*! @brief 发送请求到微信,等待微信返回onResp
*
* 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持以下类型
* SendAuthReq、SendMessageToWXReq、PayReq等。
* @param req 具体的发送请求,在调用函数后,请自己释放。
* @return 成功返回YES,失败返回NO。
*/
[WXApi sendReq: request];
}
4、支付结果回调
按照微信SDKSample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错
误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意
一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询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];
- }
- (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];
}
接下来我们需要遵守下协议
每日更新关注:http://weibo.com/hanjunqiang 新浪微博!
最后一步, 就等支付结果出来以后回调一个函数了
- /*! @brief 发送一个sendReq后,收到微信的回应
- *
- * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
- * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
- * @param resp具体的回应内容,是自动释放的
- */
- - (void)onResp:(BaseResp *)resp
- {
- //支付返回结果,实际支付结果需要去微信服务器端查询
- NSString *strMsg = [NSString stringWithFormat:@”支付结果”];
- switch (resp.errCode) {
- case WXSuccess:
- strMsg = @”支付结果:成功!”;
- NSLog(@”支付成功-PaySuccess,retcode = %d”, resp.errCode);
- break;
- default:
- strMsg = [NSString stringWithFormat:@”支付结果:失败!retcode = %d, retstr = %@”, resp.errCode,resp.errStr];
- NSLog(@”错误,retcode = %d, retstr = %@”, resp.errCode,resp.errStr);
- break;
- }
- }
/*! @brief 发送一个sendReq后,收到微信的回应
*
* 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
* 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
* @param resp具体的回应内容,是自动释放的
*/
- (void)onResp:(BaseResp *)resp
{
//支付返回结果,实际支付结果需要去微信服务器端查询
NSString *strMsg = [NSString stringWithFormat:@"支付结果"];
switch (resp.errCode) {
case WXSuccess:
strMsg = @"支付结果:成功!";
NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
break;
default:
strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
break;
}
}
这样, 我们就完成了微信支付iOS客户端的代码,了解更多请关注博主微博:
Demo下载地址:https://github.com/XiaoHanGe/WeChatPay.git
ps: 大家工作中写完以后要在真机上测试.
Detect language AfrikaansAlbanian ArabicArmenianAzerbaijani BasqueBelarusian BengaliBosnianBulgarian CatalanCebuanoChichewa Chinese (Simplified)Chinese (Traditional) CroatianCzechDanish DutchEnglishEsperanto EstonianFilipinoFinnish FrenchGalicianGeorgian GermanGreekGujarati Haitian CreoleHausaHebrew HindiHmong HungarianIcelandicIgbo IndonesianIrishItalian JapaneseJavaneseKannada KazakhKhmerKorean LaoLatinLatvian LithuanianMacedonianMalagasy MalayMalayalam MalteseMaoriMarathi MongolianMyanmar (Burmese) NepaliNorwegianPersian PolishPortuguesePunjabi RomanianRussianSerbian SesothoSinhalaSlovak SlovenianSomaliSpanish SundaneseSwahiliSwedish TajikTamilTelugu ThaiTurkishUkrainian UrduUzbekVietnamese WelshYiddishYoruba Zulu |
| Afrikaans AlbanianArabicArmenian AzerbaijaniBasqueBelarusian BengaliBosnian BulgarianCatalanCebuano ChichewaChinese (Simplified) Chinese (Traditional)Croatian CzechDanishDutch EnglishEsperantoEstonian FilipinoFinnishFrench GalicianGeorgianGerman GreekGujaratiHaitian Creole HausaHebrew HindiHmongHungarian IcelandicIgboIndonesian IrishItalianJapanese JavaneseKannadaKazakh KhmerKoreanLao LatinLatvianLithuanian MacedonianMalagasyMalay MalayalamMalteseMaori MarathiMongolianMyanmar (Burmese) NepaliNorwegian PersianPolishPortuguese PunjabiRomanianRussian SerbianSesothoSinhala SlovakSlovenianSomali SpanishSundaneseSwahili SwedishTajikTamil TeluguThaiTurkish UkrainianUrduUzbek VietnameseWelshYiddish YorubaZulu |
|