在开发之中经常会使用到支付的功能,现在常用的两种支付方式是支付宝和微信。相对而言,支付宝的文档较为健全,并且配置和调用方式方式比较简单,这里就不过多的描述。

首先去微信官网网站下去下载服务端的demo:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php"htmlcode">

  /* 微信APP下支付预下单 */
  public function wxAppOrder(){
    //TODO:首先获取订单详情,例如传递过来订单号或订单id,获取订单的详情信息,例如将取出的数据存放入$user_order_info数组,订单中包含的商品在$user_order_product_info之中。
    /* 向微信发起请求 */
    vendor('WxpayAPI.lib.WxPay','','.Api.php');
    vendor('WxpayAPI.lib.WxPay','','.Data.php');//生成数据
    //统一下单输入对象
    $order_info= new WxPayUnifiedOrder();
    $order_info->SetOut_trade_no($user_order_info['orderNo']);//商品订单号
    $body=$user_order_product_info['productName'];
    //   $body=iconv('UTF-8', 'ISO-8859-1', $user_order_product_info['productName']);
    $order_info->SetBody($body);//商品描述
    $order_info->SetTrade_type('CNY');//人民币
    $order_info->SetTotal_fee(intval($user_order_info['sumPrice']*100));//总金额,以分为单位
    $order_info->SetTrade_type('APP');//交易类型
    $order_info->SetAppid(C('wxAPPID'));
    $order_info->SetMch_id(C('wxMCHID'));
    $order_info->SetNotify_url('你的回调地址');
    $order_info->SetSign();
    //进行统一支付
    $wxpay=new WxPayApi();
    $order_result=$wxpay->unifiedOrder($order_info);//统一下单
    if ($order_result['return_code']=='FAIL') {
      $arr=array(
          'resultCode'=>'99',
          'resultDesc'=>$order_result['return_msg'],
          'resultObj'=>array(''=>''),
      );
      echo JSON($arr);
      exit();
    }
    if ($order_result['result_code']=='SUCCESS') {
    //预下单成功后,重新签名返回给移动端
      $wxpay_result=new WxPayResults();
      $timestamp=time();
      $wxpay_result->SetData('appid', $order_result['appid']);
      $wxpay_result->SetData('partnerid', $order_result['mch_id']);
      $wxpay_result->SetData('prepayid', $order_result['prepay_id']);
      $wxpay_result->SetData('timestamp', $timestamp);
      $wxpay_result->SetData('noncestr', $order_result['nonce_str']);
      $wxpay_result->SetData('package', 'Sign=WXPay');
      // $wxpay_result->SetData('key', C('wxKEY'));
      //上方注释的代码是再签名中必要的一步,只是这个包含在了微信demo的类中,如果像该项目中既有app支付,又有公众号支付,最好是注释类中代码,并自己写入
      $resign_result=$wxpay_result->SetSign();
      //处理返回数据
      $result=array(
          'appid'=>$order_result['appid'],//appid
          'partnerid'=>$order_result['mch_id'],//商户号
          'prepayid'=>$order_result['prepay_id'],//与支付id
          'package'=>'Sign=WXPay',
          'noncestr'=>$order_result['nonce_str'],
          'timestamp'=>$timestamp,
          'sign'=>$resign_result,
      );
      $arr=array(
          'resultCode'=>'00',
          'resultDesc'=>'成功',
          'resultObj'=>$result,
      );
      echo JSON($arr);
      exit();
    }else{
      $arr=array(
          'resultCode'=>'99',
          'resultDesc'=>'失败',
          'resultObj'=>$order_result,
      );
      echo JSON($arr);
      exit();
    }
  }
  /* 微信支付回调函数 */
  public function wxpayNotify(){
    vendor('WxpayAPI.lib.Logwx','','.Log.php');//在回调中最好是引入日志进行记录,在这里因为Log类与thinkphp中的log类重复,需要进行处理
    $handle=new CLogFileHandler('./Public/wxlog.txt');
    $log=Logwx::Init($handle);
    $xml = $GLOBALS['HTTP_RAW_POST_DATA'];//获取数据
    vendor('WxpayAPI.lib.WxPay','','.Api.php');
    vendor('WxpayAPI.lib.WxPay','','.Data.php');
    $wxpay=new WxPayApi();
    $notify=new WxPayNotifyReply();
    $result=WxPayResults::Init($xml);//获取数据并转换为数组
    if ($result['return_code']=='SUCCESS' && $result['result_code']=='SUCCESS') {//此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断
      //TODO:进行数据库操作的业务逻辑处理,假设其成功与否的数据为$res
      if ($res) {
        $log->INFO('订单:'.$result['out_trade_no'].'支付成功');
        $notify->SetReturn_code('SUCCESS');
        $notify->SetReturn_msg('OK');
        $notify->SetSign();
      }else{
        $log->ERROR('微信支付失败');
        $notify->SetReturn_code('FAIL');
        $notify->SetReturn_msg('客户服务器错误');
      }
    }else{
      $log->ERROR('微信回调返回错误');
      $notify->SetReturn_code('FAIL');
      $notify->SetReturn_msg('微信支付失败');
    }
    //返回微信端
    $wxpay->replyNotify($notify->ToXml());
  }
  /* 微信公众账号下单
   * 获取code等信息
  * 跳转至获取信息
  *  */
  public function wxPubOrder(){
    //此流程中
    $orderId=$_GET['orderId'];
    //注意:此处如果想要回调成功,需要在微信公众平台设置回调域名
//   print_r('Location:https://open.weixin.qq.com/connect/oauth2/authorize"appid"]);
      $timeStamp = time();
      $jsapi->SetTimeStamp("$timeStamp");
      $jsapi->SetNonceStr(WxPayApi::getNonceStr());
      $jsapi->SetPackage("prepay_id=" . $order_result['prepay_id']);
      $jsapi->SetSignType("MD5");
      $jsapi->SetPaySign($jsapi->MakeSign());
      $order_result = $jsapi->GetValues();
      //     print_r($order_result);exit();
      $arr=array(
          'resultCode'=>'00',
          'resultDesc'=>'成功',
          'resultObj'=>$order_result,
      );
      echo JSON($arr);
      exit();
    }else{
      $arr=array(
          'resultCode'=>'99',
          'resultDesc'=>'失败',
          'resultObj'=>$order_result,
      );
      echo JSON($arr);
      exit();
    }  
  }

这就是一个支付的流程,在这之中会遇到很多问题,在此给出一个大多数会遇到的问题的解决方法的大概思路:

  • 1、APP统一下单后数据返回给前端,前端调用报签名错误:首先验证自己的秘钥信息是否正确,要注意移动端和公众号的是不同的,而类拿着key又去重新签名,可以将微信官方提供的demo中的直接内部调用配置文件那里注释掉
  • 2、在公众号获取openid的时候,显示跨域:这个解决参考YII2框架中对于\yii::$app->response->header,中的remove方法,将报头去掉即可。
  • 3、对于微信支付的配置,包括公众号支付配置白名单、测试目录啥的就不过多说了,请自行搜索资料

过程中肯定还遇到很多问题,这里不一一写了,如果还有问题可以在评论中留言,大家一起讨论学习,共同进步。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

P70系列延期,华为新旗舰将在下月发布

3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。

而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?

根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。