2017-09-19 15:42:25 u014599700 阅读数 2003
  • 微信支付开发/原生态/TP开发

    微信支付是腾讯公司的支付业务品牌,微信支付提供公众号支付、APP支付、扫码支付、刷卡支付等支付方式。微信支付结合微信公众账号,全面打通O2O生活消费领域,提供专业的互联网+行业解决方案,微信支付支持微信红包和微信理财通,是移动支付的首选。

    583 人正在学习 去看看 李强强
<?php
/*
大概流程说明:
1、填写必填的参数到地址 微信统一地址 https://api.mch.weixin.qq.com/pay/unifiedorder
2、App端通过统一下单参数 返回一些数据 
3、通过得到的参数掉起微信支付,完成支付
4、此过程中需要做两次签名,
第一次签名是在上传request请求时,拼接的字符串,创建一次sign;
第二次签名是请求统一下单之后,主要是用返回的一个prepay_id的一个字符串,
根据appid、noncestr、package、partnerid、prepayid、timestamp这些字符串的内容,重新创建一次sign,
第二次的sign是为了调起微信支付用的。
*/


//填写必填的参数到地址 微信统一地址
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //微信统一地址

$body = "APP微信支付测试";
$appid = "wx111111111111";    //微信开放平台上的应用id
$mch_id = "2222222222"; //微信申请成功之后邮件中的商户id
$attach = "APP微信支付";
$total_fee = 1; //1分
$out_trade_no = rand(100000,999999);
$api_key = "as3aaaaaaaaaaaaaaaaaaaaaaaa"; //在微信商户平台上自己设定的api密钥 32位
$notify_url = "pay_weixin.php"; //自定义的回调程序地址

$nonce_str = $this->createNoncestr();


//获取签名必要参数
$data["appid"] = $appid;
$data["attach"] = $attach;
$data["body"] = $body;  
$data["mch_id"] = $mch_id;
$data["nonce_str"] = $nonce_str;
$data["notify_url"] = $notify_url;
$data["out_trade_no"] = $out_trade_no;
$data["spbill_create_ip"] = $this->get_client_ip();
$data["total_fee"] = $total_fee;
$data["trade_type"] = "APP";
   
//第一次签名 通过上传拼接的字符串 创建sign
$sign = $this->getSign($data);
$data["sign"] = $sign;


$xml = $this->arrayToXml($data);
$response = $this->postXmlCurl($xml, $url);


//将微信返回的结果xml转成数组
$response = $this->xmlToArray($response);


$new_arr=array();
$new_arr['appid'] = $appid;
$new_arr['partnerid'] = $mch_id;
$new_arr['prepayid'] = $response['prepay_id'];
$new_arr['package'] = "Sign=WXPay";
$new_arr['noncestr'] = $response['nonce_str'];
$new_arr['timestamp'] = time();


//第二次签名 调起微信支付
$sign2 = $this->getSign($new_arr);
$new_arr["sign"] = $sign2;


$xml2 = $this->arrayToXml($new_arr);
   
//将微信返回的结果xml转成数组
$response3 = $this->xmlToArray($xml2);


//数组转成json
echo json_encode($response3);
   


//微信支付 - 生成签名
public function getSign($Obj){
$api_key = "as3aaaaaaaaaaaaaaaaaaaaaaaa";


  foreach ($Obj as $k => $v){
      $Parameters[$k] = $v;
  }


  //签名步骤一:按字典序排序参数
  ksort($Parameters);
  $String = $this->formatBizQueryParaMap($Parameters, false);
  //echo '【string1】'.$String.'</br>';
  //签名步骤二:在string后加入KEY
  $String = $String."&key=".$api_key;
  //echo "【string2】".$String."</br>";
  //签名步骤三:MD5加密
  $String = md5($String);
  //echo "【string3】 ".$String."</br>";
  //签名步骤四:所有字符转为大写
  $result_ = strtoupper($String);
  //echo "【result】 ".$result_."</br>";
  return $result_;
}


//微信支付 - 产生随机字符串,不长于32位
public function createNoncestr( $length = 32 ){
  $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
  $str ="";
  for ( $i = 0; $i < $length; $i++ )  {
      $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
  }
  return $str;
}


//微信支付 - 数组转xml
public function arrayToXml($arr){
  $xml = "<xml>";
  foreach ($arr as $key=>$val){
      if (is_numeric($val)){
          $xml.="<".$key.">".$val."</".$key.">";
      }else{
          $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
      }
  }
  $xml.="</xml>";
  return $xml;
}


//微信支付 - 将xml转为array
public function xmlToArray($xml){
  //将XML转为array
  $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  return $array_data;
}


//微信支付 - 以post方式提交xml到对应的接口url
public function postXmlCurl($xml,$url,$second=30){
  //初始化curl
  $ch = curl_init();
  //设置超时
  curl_setopt($ch, CURLOPT_TIMEOUT, $second);
  //这里设置代理,如果有的话
  //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
  //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
  curl_setopt($ch,CURLOPT_URL, $url);
  curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
  curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
  //设置header
  curl_setopt($ch, CURLOPT_HEADER, FALSE);
  //要求结果为字符串且输出到屏幕上
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  //post提交方式
  curl_setopt($ch, CURLOPT_POST, TRUE);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
  //运行curl
  $data = curl_exec($ch);
  //返回结果


  if($data){
    curl_close($ch);
    return $data;
  }else{
    $error = curl_errno($ch);
    echo "curl出错,错误码:$error"."<br>";
    curl_close($ch);
    return false;
  }
}


//微信支付 - 获取当前服务器的IP
public function get_client_ip(){
  if ($_SERVER['REMOTE_ADDR']) {
     $cip = $_SERVER['REMOTE_ADDR'];
  } elseif (getenv("REMOTE_ADDR")) {
     $cip = getenv("REMOTE_ADDR");
  } elseif (getenv("HTTP_CLIENT_IP")) {
     $cip = getenv("HTTP_CLIENT_IP");
  } else {
     $cip = "unknown";
  }
  return $cip;
}


//微信支付 - 格式化参数,签名过程需要使用
public function formatBizQueryParaMap($paraMap, $urlencode){
  $buff = "";
  ksort($paraMap);
  foreach ($paraMap as $k => $v){
    if($urlencode){
        $v = urlencode($v);
    }
    $buff .= $k . "=" . $v . "&";
  }
  $reqPar;
  if (strlen($buff) > 0){
    $reqPar = substr($buff, 0, strlen($buff)-1);
  }
  return $reqPar;
}
     
2014-09-26 10:14:46 phoenix_cat 阅读数 66
  • 微信支付开发/原生态/TP开发

    微信支付是腾讯公司的支付业务品牌,微信支付提供公众号支付、APP支付、扫码支付、刷卡支付等支付方式。微信支付结合微信公众账号,全面打通O2O生活消费领域,提供专业的互联网+行业解决方案,微信支付支持微信红包和微信理财通,是移动支付的首选。

    583 人正在学习 去看看 李强强

 

同样是见微信官网:http://weixin.qq.com/

 

然后到里面找资源中心即可。

 

IOS调用微信支付开发SDK下载:

https://open.weixin.qq.com/cgi-bin/frame?t=resource/res_main_tmpl&verify=1&lang=zh_CN&target=res/app_download_ios

 

 

 

http://mobile.51cto.com/others-388964.htm IOS调用微信方法

 

http://blog.csdn.net/worker90/article/details/8211451 安卓调用微信SDK教程

 

http://www.healthking.cc/UploadFile/Down/2014618154711343.pdf 财付通支付流程,供参考。

2016-08-29 20:17:49 jiang314 阅读数 4579
  • 微信支付开发/原生态/TP开发

    微信支付是腾讯公司的支付业务品牌,微信支付提供公众号支付、APP支付、扫码支付、刷卡支付等支付方式。微信支付结合微信公众账号,全面打通O2O生活消费领域,提供专业的互联网+行业解决方案,微信支付支持微信红包和微信理财通,是移动支付的首选。

    583 人正在学习 去看看 李强强

前言



直入主题

有关微信支付问题
在这里就不再介绍有关微信支付申请的流程了,小白可以参看微信开放平台微信服务号也可申请微信支付接口。这里是微信官方给的微信支付接入指南(然而并没有太大用处)


1. APP支付

1.业务流程:(这个很重要)


APP支付时序图

这个图需要看懂:为了各种原因,下单、请求支付、结果回调等一般安排公司后台完成
大致流程如下:

  • 【APP】用户使用商户APP选择商品完成下单
  • 【APP】向公司服务器请求生成支付订单
  • 【服务器】公司服务器调用统一下单接口
  • 【微信完成】生成订单返回预支付信息(prepay_id)给公司服务器
  • 【服务器】根据prepay_id生成带签名的支付信息,返回给移动端
  • 【微信APP】微信授权需用户确认
  • 【APP】通过公司服务器回调参数,调用微信SDK发起支付请求
  • 【微信APP】向微信服务器发送请求,返回支付授权
  • 【微信APP】用户确认支付,输入密码,提交微信服务器授权
  • 【微信服务器】验证授权,异步通知公司服务器和移动端APP
  • 【APP】可向公司服务器查询订单信息
    需要查看官方文档,请点击这里
    2.iOS开发xCode配置环境
    有关demo下载,根据本文_作者demo iOS微信官方demo
  • 向微信注册你的应用程序id,具体教程可点击这里
  • 下载"微信SDK",截止今日SDK已经更新到1.7.1已支持ipv6的。
  • 使用xcode新建一个工程,将libWeChatSDK.a,WXApi.h,WXApiObject.h三个文件添加到工程中,如下图:

    导入SDK文件
  • 添加依赖库:
    SystemConfiguration.framework,
    libz.tbd,
    libsqlite3.0.tbd,
    libc++.tbd.
    CoreTelephony.framework(不添加会报这个错误
    "_OBJC_CLASS_$_CTTelephonyNetworkInfo", referenced from:)

    需要添加库
  • 允许http请求,编辑Info.plist,在其中添加
    <key>NSAppTransportSecurity</key><dict> <key>NSAllowsArbitraryLoads</key> <true/></dict>

    配置http请求
  • 配置URL scheme(应用跳转返回应用标识)
    还记得你在微信注册应用分配给你的id麽?就是需要这个东西


    查看微信AppID


    填写完成大概就是这样


    配置scheme
  • 这里需要注意一下在iOS9以后,唤起另一个APP时(此时是欢迎微信第三方APP完成支付)需要在info.plist中配置一下
    LSApplicationQueriesSchemesiOS9之后才会需要,iOS9之后提高了APP的安全性,需要给出一个类似白名单的东西,在白名单里面的才能打开APP。不然报错:
    -canOpenURL: failed for URL: "OpenAppTest://mark?id=007" - error: "This app is not allowed to query for scheme OpenAppTest"
    配置结束~应该就是这个样子~


    配置白名单

配置开发环境遇到的各种坑:
1.到此开发环境已经全部结束了,至于有些导入依赖库遇到的.dylib文件都是很老的版本了。xcode7.0之后导入.tbd即可。
2.至于有关在Build Setting的Search Paths中添加我们刚刚导入的SDK文件有关问题都不需要做了,Xcode都已经帮我们处理好了。至少使用xcode7.0之后都已经帮我们搞定了,在这里,不得不说微信这部分文档确实很老了。
......

到此为止,有关微信分享好友、朋友圈、收藏等第三方支付环境配置问题已经结束~接下来正式码砖了~


3.SDK使用

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;方法中向微信终端注册你的AppID


    注册AppID
  2. 配置AppDelegate中的代码,效果图见后
    (1).导入头文件
    #import "WXApi.h"
    #import "WXApiObject.h"
    (2). 重写AppDelegate中handleOpenURLopenURL方法:(多个应用之间的调用)
    (3). 在需要与微信交互的地方,遵守WXApiDelegate协议,实现协议中的两个方法(处理向微信发送、微信返回结果回调)
    - (void)onReq:(BaseReq *)req- (void)onResp:(BaseResp *)resp;


AppDelegate

附: 需要给微信发消息,则需要调用WXApi的sendReq函数(例如:微信分享好友、朋友圈等时)
- (BOOL)sendReq:(BaseReq *)req
3.生成订单

用户选择商品后,在这里向后台服务器发送下单请求,服务器将生成订单信息等微信所下发的预支付id、签名等信息。然后发起支付调用surePay方法

4.完成支付请求

后台生成prepayid、签名sign后调用微信SDK发起支付

//需要创建这个支付对象
PayReq *req = [[PayReq alloc] init];

//应用id
req.openID = kWXAPP_ID;

// 商家商户号
req.partnerId = kWX_PARTNERID;

// 预支付订单这个是后台跟微信服务器交互后,微信服务器传给你们服务器的,你们服务器再传给你
req.prepayId = @"";//self.orderWithWX.prepayid;

// 根据财付通文档填写的数据和签名
//这个比较特殊,是固定的,只能是即req.package = Sign=WXPay
req.package = @"Sign=WXPay";

// 随机编码,为了防止重复的,在后台生成
req.nonceStr = @"";//self.orderWithWX.noncestr;

// 这个是时间戳,也是在后台生成的,为了验证支付的
NSString * stamp = @"";//self.orderWithWX.timestamp;
req.timeStamp = stamp.intValue;

// 这个签名也是后台做的
req.sign = @"";//self.orderWithWX.sign;

//发送请求到微信,等待微信返回onResp
[WXApi sendReq:req];

5.支付结果回调
还记得在AppDelegate中配置的回调方法麽- (void)onResp:(BaseResp*)resp;
如下图:


回调结果处理

有关demo下载,根据本文_作者demo iOS微信官方demo

2015-09-23 22:27:19 u011363981 阅读数 6509
  • 微信支付开发/原生态/TP开发

    微信支付是腾讯公司的支付业务品牌,微信支付提供公众号支付、APP支付、扫码支付、刷卡支付等支付方式。微信支付结合微信公众账号,全面打通O2O生活消费领域,提供专业的互联网+行业解决方案,微信支付支持微信红包和微信理财通,是移动支付的首选。

    583 人正在学习 去看看 李强强

前段时间,公司业务需要接入微信支付,博主就苦心钻研了2天,终于搞通了,但最近 iOS 9 更新出来后,微信支付,又不可以使用了,具体解决方案我在后面会给出。当然,微信接入也有不少的坑啊 说多了全是泪,三巨头的东西也不一定总是那么好使!好了正题来了!

虽是基于iOS的,同时,安卓的接入也类似。

要完成手机APP跳转到微信的APP进行微信支付,需要先进行如下操作:

1、先去微信的开放平台(http://open.weixin.qq.com)进行微信开发者账号的注册(建议公司统一注册,尽量不要使用私人邮箱)。

2、新建一个APP应用,然后填写必填的信息提交审核,这里 一次性注册iOS和安卓两个版本的APP。

3、查看已创建好的APP应用,进行申请“ 获得微信支付能力 ”的功能,需要提交公司真实的相关营业执照等信息证明。

提交申请后,经过一周左右,基本可以申请下来,没有细节难点,应该都能搞定,实在不行,给你个机会,联系客服妹子吧!

基本的对接流程 微信官网的有详细的讲解  (https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_1


一、服务器的接入

首先,这一部分后台接入,我们只需要根据后台提供的接口,调用即可。在进行服务端对接之前,需要用到如下信息:

/* 微信app key 这两个就是我们上面申请的APP得到的*/
W_APP_ID
W_APP_SECRET
//商户号
W_MCH_ID--这个也是需要登录商户平台进行获得
//API密钥,在商户平台设置
W_API_KEY--这个需要登录商户平台进行获得

商户平台的登录地址(https://pay.weixin.qq.com/index.php

一、.net服务端的对接:

1、直接上微信的SDK列表下载.net的SDK(https://pay.weixin.qq.com/wiki/doc/api/download/WxPayAPI_CS_v3.zip

2、要先知道一点,下载回来的SDK是没有具体包含“统一下单API”的,只包含了这个“刷卡支付、微信内网页支付、扫码支付”

3、下载回来的SDK中,第一次运行是运行不了的,需要对代码进行设置

  1)对上面四个参数进行配置,具体在lib\Config.cs文件中

  2)屏蔽掉lib\HttpService.cs的代理访问:(这东西基本可以不用使用到)

  技术分享

4、通过以上的几步配置,基本可以运行了

5、还有一个点,我们点击Default.aspx页面上的按钮,链接过去的地址要注意一下,其实不是我们的测试工程,而是paysdk.weixin.qq.com的,这个需要改成是我们的测试功能才行(这个是比较吭的)。

6、如何对接“统一下单API”,最基本的做法就是打开business\JsApiPay.cs文件,然后拷贝GetUnifiedOrderResult方法直接用,但是如果拷贝这个方法用的时候,会提示“无权限调用”。其实最根本的错误在于我们传递的trade_type为JSAPI导致的,所以拷贝过来使用的时候,需要做如下的更新:(为什么要这样了,原因很简单,这个方法的用途本来就是给JSAPI的,我们是要使用trade_type为APP进行调用,这些参数当然要变拉)

技术分享

只要这些字段即可,其余的可有可无,都不影响,到了这点,你运行“统一下单”功能,就会返回prepay_id了,也就是支付ID。

至此,通过这些设置,基本都可能成功。


二、iOS的对接

最常见的问题就是,我把官方的请求地址换成了自己之后,点击支付测试,跳转到微信支付的页面时,中间就只出现了一个“确定”按钮,点击之后返回到原APP,提示“支付失败,xxx -2”这样的提示。

1、如果你有这些提示了,我可以很肯定的告诉你,你的sign错了,而且是用错了,你不应该直接用服务端返回的sign,这个根本不是一回事。

2、切记,客户端的sign字段,是要自己生成的,当然服务端哥们给力的话,也可以,记得协商好哈。

3、还要切记,服务端返回的那一串json,最有用而且最优价值的就唯一一个prepay_id,其余的基本不需要。

4、官方的iOS SDK中,包含了两个方法(sendpay_demo、sendpay),这也是最容易错的,我们在对接的时候,选择sendpay的方法,也就是这个:

技术分享

这个方法的东西其实是不完整,最明显,我们把网络请求改了之后,再把所用到的参数赋值,然后就没有然后了,根本调不起来,压根就没反应,原因是缺少了package参数值,这个是固定的(Sign=WXPay

技术分享

5、改了第四点之后,肯定是能调用起来的了,但是确不能支付,sign错误导致的,至此,你应该把注意力集中到sendpay_demo的方法中去,不要再使用sendpay方法了

只需要把刚才获取的prepay_id替换掉,立马就能正常使用支付功能,如下位置的参数替换成我们网络请求返回的的就行了:

技术分享技术分享


三、iOS9 白名单 微信支付提示未安装微信 、支付宝不跳转客户端支付的解决方案

苹果公司iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。

受此影响,当你的应用在iOS 9中需要使用微信SDK的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码:

<key>LSApplicationQueriesSchemes</key>

<array>

 <string>weixin</string>

 <string>wechat</string>

 <string>alipay</string>

</array>

<key>NSAppTransportSecurity</key>

<dict>

 <key>NSAllowsArbitraryLoads</key>

<true/>

</dict>

完成后需使用Xcode 7编译。

请注意:未升级到微信6.2.5及以上版本的用户,在iOS 9下使用到微信相关功能时,仍可能无法成功。4

总结,希望此篇文章对正在做微信支付对接的哥们有帮助,也让大家少走一些弯路,如果觉得合适,可以顺手点个赞,以此鼓励鼓励。thanks




2015-07-06 14:28:23 huobanbengkui 阅读数 1623
  • 微信支付开发/原生态/TP开发

    微信支付是腾讯公司的支付业务品牌,微信支付提供公众号支付、APP支付、扫码支付、刷卡支付等支付方式。微信支付结合微信公众账号,全面打通O2O生活消费领域,提供专业的互联网+行业解决方案,微信支付支持微信红包和微信理财通,是移动支付的首选。

    583 人正在学习 去看看 李强强

    微信无孔不入的插入到我们生活中,简直是烦得受不了;嘻嘻,同样是不是也方便的杠杠的,省去了我们好多繁琐的手机验证注册的事情。

因此, 在你的微信中接入微信授权登陆和微信支付,是一件让各位同学爽爽的事情;

     首先,我们谈谈微信授权登陆:

1. 到微信开发平台注册相关APP(地址:https://open.weixin.qq.com),现在是等待审核成功后才能获取到对应的key和secret;获取成功后需要单独申请开通登录和支付接口,如图

1411370441623372.png

2.下载SDK,导入工程中,如果出现以下错误,只需要用切换到Demo中的SDK即可

3.配置项目文件 (详见:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417694084&token=&lang=zh_CN)

4. 接下来,就是填写我们最擅长的代码了:

4.1:向微信注册:在AppDelegate.m 中引入#import "WXApi.h",并接受WXApiDelegate代理,

            然后注册:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [WXApi registerApp:@"wx9f6ca5429bd6c702" withDescription:@"Test"];
    return YES;
}

4.2:实现代理和回调语句

//第三方程序,向微信发送请求,sendReq请求调用后,会切到微信终端程序界面
- (void)onResp:(BaseResp *)resp

{

/*

    ErrCode ERR_OK = 0(用户同意)  
    ERR_AUTH_DENIED = -4(用户拒绝授权)  
    ERR_USER_CANCEL = -2(用户取消)  
    code    用户换取access_token的code,仅在ErrCode为0时有效  
    state   第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K  
    lang    微信客户端当前语言  
    country 微信用户当前国家信息  
    */        
    SendAuthResp *aresp = (SendAuthResp *)resp;

}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [WXApi handleOpenURL:url delegate:self];
}

5.完成准备工作,我们开始 实现授权登录功能

 5.1 发送登录信息

- (IBAction)pushMessage:(id)sender {
//    对于iOS应用,考虑到iOS应用商店审核指南中的相关规定,建议开发者接入微信登录时,先检测用户手机是否已安装微信客户端(使用sdk中isWXAppInstalled函数 ),对未安装的用户隐藏微信登录按钮,只提供其他登录方式(比如手机号注册登录、游客登录等)。
    //判断是否安装微信
    [WXApi isWXAppInstalled];
    
    //第一步,请求Code; 第二步,根据Code获取token;第三步,根据token和API获取用户相关数据
    //获取token
    SendAuthReq *req = [[SendAuthReq alloc] init];
//    应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
    //微信如何识别发起请求者,通过注册获得到得Key
    req.scope = @"snsapi_userinfo";
    req.state = @"345678";
    [WXApi sendReq:req];
}

5.2 当在微信界面点击取消或授权以后,会调用AppDelegate.m中的- (void)onResp:(BaseResp *)resp方法

在resp中会带有code信息,SendAuthResp *aresp = (SendAuthResp *)resp;    

    if (aresp.errCode== 0) {    
        NSString *code = aresp.code;       
    }
5.3 通过Code获得token

-(void)getAccess_token:(NSString *)code
{
    
//    利用GCD来获取对应的token和openID.
    //https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
    NSString *appid = @"";  //注册应用时获得的key
    NSString *sercet = @"";//注册应用时获得的sercet
    
    NSString *url = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code", appid, sercet, code];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *zoneUrl = [NSURL URLWithString:url];
        NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (data) {
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                /*
                 {
                 "access_token" = "OezXcEiiBSKSxW0eoylIeJDUKD6z6dmr42JANLPjNN7Kaf3e4GZ2OncrCfiKnGWiusJMZwzQU8kXcnT1hNs_ykAFDfDEuNp6waj-bDdepEzooL_k1vb7EQzhP8plTbD0AgR8zCRi1It3eNS7yRyd5A";
                 "expires_in" = 7200;
                 openid = oyAaTjsDx7pl4Q42O3sDzDtA7gZs;
                 "refresh_token" = "OezXcEiiBSKSxW0eoylIeJDUKD6z6dmr42JANLPjNN7Kaf3e4GZ2OncrCfiKnGWi2ZzH_XfVVxZbmha9oSFnKAhFsS0iyARkXCa7zPu4MqVRdwyb8J16V8cWw7oNIff0l-5F-4-GJwD8MopmjHXKiA";
                 scope = "snsapi_userinfo,snsapi_base";
                 }
                 */
               
                [self getUserInfo:[dic objectForKey:@"access_token"] openid:[dic objectForKey:@"openid"]];
                
            }
        });
    });
}

5.4 根据token 和openid 获得用户跟人信息

-(void)getUserInfo:(NSString *)token openid:(NSString *)openid
{
    NSString *url =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",token,openid];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *zoneUrl = [NSURL URLWithString:url];
        NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (data) {
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                NSLog(@"%@",dic);
                /*
                 {
                 city = Haidian;
                 country = CN;
                 headimgurl = "http://wx.qlogo.cn/mmopen/FrdAUicrPIibcpGzxuD0kjfnvc2klwzQ62a1brlWq1sjNfWREia6W8Cf8kNCbErowsSUcGSIltXTqrhQgPEibYakpl5EokGMibMPU/0";
                 language = "zh_CN";
                 nickname = "xxx";
                 openid = oyAaTjsDx7pl4xxxxxxx;
                 privilege =     (
                 );
                 province = Beijing;
                 sex = 1;
                 unionid = oyAaTjsxxxxxxQ42O3xxxxxxs;
                 }
                 */        
            }
        });
        
    });
}

6.到此,微信授权登录,然后获得个人相关信息,介绍完毕。


———********************************************************************************************————

下边开始介绍微信支付功能

微信支付的配置方法和微信授权登陆的配置方法一样。

微信支付分为三个阶段,1.通过统一下单API生成预付订单;2.通过预付订单获得到得数据发起微信支付请求;3.处理支付回调结果,判断是否支付成功;

1.通过统一下单API生成预付订单,

   在这时候分两种两种情况,一种是有后台生成,一种时候前端生成;

2。具体使用方法,详情可以在Demo中看到。









没有更多推荐了,返回首页