无限星辰工作室-客户无限互联网动力之源

标题: ThinkPHP微信支付接口开发 [打印本页]

作者: crx349    时间: 2015-12-1 14:54
标题: ThinkPHP微信支付接口开发
开发步骤
一、进入公众号平台,先设置几个参数,包括绑定域名、设置回调地址等等。
1、在设置 -> 公众号设置 -> 功能设置 -> 设置JS接口安全域名
(, 下载次数: 1651)
2、在微信支付 -> 开发配置 -> 配置你的js支付接口,回调地址等等,正式目录和测试目录都可以写上,测试目录需要把个人微信号先添加到白名单才能使用(提醒:用TP框架的小伙伴们在填写支付授权目录时可以这样填写:域名/index.php/控制器/,经测试是可以通过的,微信一样能检测到,之前看到网上有人说这样不行,可能是现在升级了吧,呵呵,还有一个就是域名一定要是已经备过案的才行,如果是在本地进行测试的小伙伴们可以使用花生壳,我不是在打广告,个人觉得还是挺好用的)
(, 下载次数: 1414)
3、在开发者中心把“网页授权获取用户基本信息”的域名写上自己的域名,微信登陆时需要用到的;
(, 下载次数: 1411)
二、到上面一大步设置完成后就可以开始我们的开发工作了;
1、用TP的小伙伴们可以用下面的包放到tp的扩展里,也可以自行到官网下载sdk包,具体目录:ThinkPHPLibraryVendor,其它就可以不用管啦;
2、打开包里的WxPayPubConfig.php文件,填写上你的微信支付的接口信息就好啦;
三、上面二大步都是配置,这一步就是写支付类了,其实也没什么的,复制粘贴就好了;
1、新建Wxpay控制器,当然你也可以自己命名,访问的名称要跟你在微信上配置的授权目录一样就好了
2、代码的地方就不多说了,下面直接上代码;
  1. <?php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4. //微信支付类
  5. class WxpayController extends Controller {
  6.     //获取access_token过程中的跳转uri,通过跳转将code传入jsapi支付页面
  7.     public function js_api_call() {
  8.         $order_sn = I('get.order_sn', '');
  9.         if (empty($order_sn)) {
  10.             header('location:'.__ROOT__.'/');
  11.         }
  12.         vendor('Weixinpay.WxPayPubHelper');
  13.         //使用jsapi接口
  14.         $jsApi = new \JsApi_pub();
  15.         //=========步骤1:网页授权获取用户openid============
  16.         //通过code获得openid
  17.         if (!isset($_GET['code'])){
  18.             //触发微信返回code码
  19.             $url = $jsApi->createOauthUrlForCode('域名/Wxpay/js_api_call?order_sn='.$order_sn);
  20.             //$url = $jsApi->createOauthUrlForCode(\WxPayConf_pub::JS_API_CALL_URL);
  21.             Header("Location: $url");
  22.         }else{
  23.             //获取code码,以获取openid
  24.             $code = $_GET['code'];
  25.             $jsApi->setCode($code);
  26.             $openid = $jsApi->getOpenId();
  27.         }
  28.         $res = array(
  29.             'order_sn' => '20150109113322',
  30.             'order_amount' => 255
  31.         );
  32.         //=========步骤2:使用统一支付接口,获取prepay_id============
  33.         //使用统一支付接口
  34.         $unifiedOrder = new \UnifiedOrder_pub();
  35.         //设置统一支付接口参数
  36.         //设置必填参数
  37.         //appid已填,商户无需重复填写
  38.         //mch_id已填,商户无需重复填写
  39.         //noncestr已填,商户无需重复填写
  40.         //spbill_create_ip已填,商户无需重复填写
  41.         //sign已填,商户无需重复填写
  42.         $total_fee = $res['order_amount']*100;
  43.         //$total_fee = 1;
  44.         $body = "订单支付{$res['order_sn']}";
  45.         $unifiedOrder->setParameter("openid", "$openid");//用户标识
  46.         $unifiedOrder->setParameter("body", $body);//商品描述
  47.         //自定义订单号,此处仅作举例
  48.         $out_trade_no = $res['order_sn'];
  49.         $unifiedOrder->setParameter("out_trade_no", $out_trade_no);//商户订单号
  50.         $unifiedOrder->setParameter("total_fee", $total_fee);//总金额
  51.         //$unifiedOrder->setParameter("attach", "order_sn={$res['order_sn']}");//附加数据
  52.         $unifiedOrder->setParameter("notify_url", \WxPayConf_pub::NOTIFY_URL);//通知地址
  53.         $unifiedOrder->setParameter("trade_type", "JSAPI");//交易类型
  54.         //非必填参数,商户可根据实际情况选填
  55.         //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号  
  56.         //$unifiedOrder->setParameter("device_info","XXXX");//设备号
  57.         //$unifiedOrder->setParameter("attach","XXXX");//附加数据
  58.         //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
  59.         //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
  60.         //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
  61.         //$unifiedOrder->setParameter("openid","XXXX");//用户标识
  62.         //$unifiedOrder->setParameter("product_id","XXXX");//商品ID
  63.         $prepay_id = $unifiedOrder->getPrepayId();
  64.         //=========步骤3:使用jsapi调起支付============
  65.         $jsApi->setPrepayId($prepay_id);
  66.         $jsApiParameters = $jsApi->getParameters();
  67.         $wxconf = json_decode($jsApiParameters, true);
  68.         if ($wxconf['package'] == 'prepay_id=') {
  69.             $this->error('当前订单存在异常,不能使用支付');
  70.         }
  71.         $this->assign('res', $res);
  72.         $this->assign('jsApiParameters', $jsApiParameters);
  73.         $this->display('jsapi');
  74.     }
  75.     //异步通知url,商户根据实际开发过程设定
  76.     public function notify_url() {
  77.         vendor('Weixinpay.WxPayPubHelper');
  78.         //使用通用通知接口
  79.         $notify = new \Notify_pub();
  80.         //存储微信的回调
  81.         $xml = $GLOBALS['HTTP_RAW_POST_DATA'];   
  82.         $notify->saveData($xml);
  83.         //验证签名,并回应微信。
  84.         //对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
  85.         //微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
  86.         //尽可能提高通知的成功率,但微信不保证通知最终能成功。
  87.         if($notify->checkSign() == FALSE){
  88.             $notify->setReturnParameter("return_code", "FAIL");//返回状态码
  89.             $notify->setReturnParameter("return_msg", "签名失败");//返回信息
  90.         }else{
  91.             $notify->setReturnParameter("return_code", "SUCCESS");//设置返回码
  92.         }
  93.         $returnXml = $notify->returnXml();
  94.         //==商户根据实际情况设置相应的处理流程,此处仅作举例=======
  95.         //以log文件形式记录回调信息
  96.         //$log_name = "notify_url.log";//log文件路径
  97.         //$this->log_result($log_name, "【接收到的notify通知】:\n".$xml."\n");
  98.         $parameter = $notify->xmlToArray($xml);
  99.         //$this->log_result($log_name, "【接收到的notify通知】:\n".$parameter."\n");
  100.         if($notify->checkSign() == TRUE){
  101.             if ($notify->data["return_code"] == "FAIL") {
  102.                 //此处应该更新一下订单状态,商户自行增删操作
  103.                 //$this->log_result($log_name, "【通信出错】:\n".$xml."\n");
  104.                 //更新订单数据【通信出错】设为无效订单
  105.                 echo 'error';
  106.             }
  107.             else if($notify->data["result_code"] == "FAIL"){
  108.                 //此处应该更新一下订单状态,商户自行增删操作
  109.                 //$this->log_result($log_name, "【业务出错】:\n".$xml."\n");
  110.                 //更新订单数据【通信出错】设为无效订单
  111.                 echo 'error';
  112.             }
  113.             else{
  114.                 //$this->log_result($log_name, "【支付成功】:\n".$xml."\n");
  115.                 //我这里用到一个process方法,成功返回数据后处理,返回地数据具体可以参考微信的文档
  116.                 if ($this->process($parameter)) {
  117.                     //处理成功后输出success,微信就不会再下发请求了
  118.                     echo 'success';
  119.                 }else {
  120.                     //没有处理成功,微信会间隔的发送请求
  121.                     echo 'error';
  122.                 }
  123.             }
  124.         }
  125.     }
  126.     //订单处理
  127.     private function process($parameter) {
  128.         //此处应该更新一下订单状态,商户自行增删操作
  129.         /*
  130.         * 返回的数据最少有以下几个
  131.         * $parameter = array(
  132.             'out_trade_no' => xxx,//商户订单号
  133.             'total_fee' => XXXX,//支付金额
  134.             'openid' => XXxxx,//付款的用户ID
  135.         );
  136.         */
  137.         return true;
  138.     }
  139. }
  140. ?>

复制代码


四、以上就是微信支付的整个流程了,扫码支付的应该都差不多,我没去弄了,用过的朋友也可以分享下,^_^;来上几张支付的截图


转:http://www.web-fish.com/program/php/856.html








欢迎光临 无限星辰工作室-客户无限互联网动力之源 (https://xmspace.net/) Powered by Discuz! X3.4