iOS中 最新微信支付/最全的微信支付教程详解
AsaKQRZ
9年前
<p>亲们, 首先让我们来看一下微信支付的流程吧.</p> <p>1. 注册微信开放平台,创建应用获取appid,appSecret,申请支付功能,申请成功之后会返回一些参数.</p> <p>2. 下载微信支付sdk</p> <p>3. 客户端请求订单,后台与微信后台交互,返回给客户端支付参数</p> <p>4. 调用微信客户端,由微信客户端和微信服务器打交道;</p> <p>5. 客户端和服务端都会收到支付结果;(前台消息不可靠,我们需要去后台验证,如果后台没有收到支付通知,后台去微信服务器验证然后将结果返回给客户端)</p> <p> </p> <p>支付流程图(大家看一下支付流程).</p> <p><img alt="" src="https://simg.open-open.com/show/1948f7d4936688c9b7e5132dc5219ebb.png"></p> <p>那么我们现在就开始写微信支付的demo了.</p> <p><strong>开发步骤</strong></p> <p>1:去微信开放平台注册应用</p> <p><strong><a href="https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN&token=2c0fee9c43e1eb8f9febcc7cb73abf598e2d4011">https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN&token=2c0fee9c43e1eb8f9febcc7cb73abf598e2d4011</a></strong></p> <p><br> 创建移动应用并成功之后会收到腾讯发来的邮件</p> <p><img alt="" src="https://simg.open-open.com/show/815b36a938c99d4c5b65a975003f9531.jpg"></p> <p><strong>通过邮件我们能获得重要的参数:</strong></p> <p>(1):AppID</p> <p>(2):微信支付商户号</p> <p>(4):前往商户平台完成入驻</p> <p>(4):API秘钥(自己设置即可,注意一定要32位字母加数字的组合)记得保存好秘钥,以后要使用</p> <p> </p> <p><br> <img alt="" src="https://simg.open-open.com/show/8621cd9ec22f2934e269d101d0a5062f.jpg"></p> <p><img alt="" src="https://simg.open-open.com/show/df6706740d233770632ab84094315e8d.jpg"></p> <p>有了这些参数后,我们就可以开发自己的项目了.</p> <p>接下来, 我们就新建一个微信工程吧.</p> <p>创建好工程以后呢, 我们去微信平台下载sdk</p> <p>链接: <a href="/misc/goto?guid=4959670835232694961"> https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5#</a></p> <p> </p> <p><img alt="" src="https://simg.open-open.com/show/0da26034d1e4114991b11ae8bbf25ec3.jpg"></p> <p>下载好以后呢, 我们就开始集成SDK了</p> <p> </p> <p><br> <img alt="" src="https://simg.open-open.com/show/c7a90e9a14f81de9d35fe704d1e54d5b.jpg"><br> <img alt="" src="https://simg.open-open.com/show/66eeea7a585a758f6645265d9cb0d2f4.jpg"></p> <p>把左边的SDK拉到工程里面哦.</p> <p>大家会看到文件夹里面有集成SDK的步骤.</p> <p><img alt="" src="https://simg.open-open.com/show/dafe54d034d0ad91d593546bc9ca7a21.jpg"></p> <p><img alt="" src="https://simg.open-open.com/show/8a790d711a635875cc61abd3b994d911.jpg"></p> <p>第一步: 在info.plist添加如下代码</p> <p><img alt="" src="https://simg.open-open.com/show/5568b95440042310ebb5f84ddace3b47.jpg"></p> <p>这个大家都很熟练拉</p> <p>第二步:</p> <p>添加需要的框架和依赖库 (ps: 官方文档没让添加libc++.tbd, 这点也是工程报错的时候发现的...)</p> <p> </p> <p><img alt="" src="https://simg.open-open.com/show/848cc50f1cf17530a1c2e9df316e1b6c.jpg"></p> <p>剩下的事情, 我们只需要按照官方文档来做就行了, 亲们.</p> <p><br> 我们还回到上个页面.</p> <p> </p> <p><img alt="" src="https://simg.open-open.com/show/33b9b6113c164bc335495faf82b39acb.jpg"></p> <p>微信:APPID:wx920fde9f97d60569</p> <p> </p> <p>我们可以先使用这个APPID (ps: 这是同事的前公司的应用ID)</p> <p>1、项目设置APPID</p> <p>商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID。</p> <p>这个我们按照文档做一下就可以了.</p> <p><img alt="" src="https://simg.open-open.com/show/1ada499f8509bd7af87847f41f5d940c.jpg"></p> <p>2、注册APPID</p> <p>商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:</p> <p>[WXApi registerApp:@"wxd930ea5d5a258f4f];</p> <p> </p> <p>3、调起支付</p> <p>商户服务器生成支付订单,先调用【<a href="/misc/goto?guid=4959670835311583794">统一下单API</a>】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:</p> <p>现在我们只需要在控制器上添加一个button, 名字改成微信支付就可以了</p> <p>button事件:</p> <p> </p> <pre> <code class="language-objectivec">- (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]; }</code></pre> <p> </p> <p>4、支付结果回调</p> <p>按照微信SDKSample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错</p> <p>误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意</p> <p>一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。</p> <p>这是最后一步了, 我们在支付页面支付完成以后呢要知道支付结果, 怎么做呢?</p> <p>首先, 在AppDelegate.m里面实现该方法</p> <p> </p> <pre> <code class="language-objectivec">- (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]; }</code></pre> <p> </p> <p> </p> <p>接下来我们需要遵守下协议</p> <p><img alt="" src="https://simg.open-open.com/show/579b41e6e95c9de024372e2957f067e8.jpg"></p> <p> </p> <p>最后一步, 就等支付结果出来以后回调一个函数了</p> <pre> <code class="language-objectivec">/*! @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; } }</code></pre> <p> </p> <p>这样, 我们就完成了微信支付iOS客户端的代码,了解更多请关注博主微博:</p> <p><br> Demo下载地址:https://github.com/XiaoHanGe/WeChatPay.git<br> ps: 大家工作中写完以后要在真机上测试.<br> </p> <p>来自: <a href="/misc/goto?guid=4959670835400649413" rel="nofollow">http://blog.csdn.net/qq_31810357/article/details/51163567</a></p>