zoukankan      html  css  js  c++  java
  • 微信JSAPI支付

    最近在微信H5页面内集成微信JSAPI支付,遇到不少问题,现将集成步骤及遇到的问题记录如下:

    1.官方下载SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip

    2.下载之后,只保留存放证书的文件cert(从微信公众平台“API安全”中下载),库文件lib,日志文件logs,以及example里面的notify.php,jsapi.php文件

    3.配置WxPay.Config.php文件(注意:商户支付密钥key是在微信支付平台“API安全”中设置,地址:https://pay.weixin.qq.com/index.php/account/api_cert,公众账号secret即APPSECRET是在微信公众平台中设置,地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN)。

    4.进入微信公众平台,设置微信支付授权目录(一般指的是发起微信支付的上一级目录)及网页授权(开发者中心-》接口权限-》网页授权,填写访问域名即可)。

    5.构建微信支付地址

    private $snsapi_base_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?';
     
    $param = array(
                    'appid' => '你的APPID',
                    'redirect_uri'  => '回调地址',   //地址指向官方文档中的jsapi.php.作用:调用微信客服端,发起支付。
                    'response_type'  => 'code',
                    'scope'  => 'snsapi_base',
                    'state'  => ’订单号‘
                );
    $url = $this->snsapi_base_url.http_build_query($param).'#wechat_redirect';

    6.打开jsapi.php(注意:从这里开始,微信官方文档就开始坑了)

    //注意事项
        //1.获取用户openid 官方文档的写法如下
        $tools = new JsApiPay();
        $openId = $tools->GetOpenid();
        //改成如下
        $tools = new JsApiPay();
        $openId = $tools->GetOpenidFromMp($_GET['code']); //如果是liunx系统,注意区分大小写 (官方都是不区分大小写的)
    
        
         //2.
      $input = new WxPayUnifiedOrder();
      $input->SetBody("test");   //商品描述
      $input->SetAttach("test"); //附加信息
      $input->SetOut_trade_no($order_sn);  //商品订单号
      $input->SetTotal_fee("1"); //商品费用  注意:以’分‘为单位
      $input->SetTime_start(date("YmdHis"));
      //$input->SetTime_expire(date("YmdHis", time() + 600));  直接去掉吧
      $input->SetGoods_tag("test"); //商品标记
      $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php"); //通知地址,官方文档中的notify.php,作用:处理支付成功后的订单状态及相关信息。
      $input->SetTrade_type("JSAPI");
      $input->SetOpenid($openId);
      $order = WxPayApi::unifiedOrder($input);
      //3.注意引用文件的路径

     7.打开notify.php

      一、将官方文档中的Log::全部改成Logwx::(因为官方定义的类是Logwx,但在这里引用的时候变成了Log,坑啊)。

      二、注意引用文件的路径(注:下载的官方文档,需要更改路径的文件:jsapi.php,notify.php,WxPay.Config.php)。

      三、

    <?php
    ini_set('date.timezone','Asia/Shanghai');
    error_reporting(E_ERROR);
    
    require_once "lib/WxPay.Api.php";
    require_once 'lib/WxPay.Notify.php';
    require_once 'log.php';
    
    //初始化日志
    $logHandler= new CLogFileHandler("logs/".date('Y-m-d').'.log');
    $log = Logwx::Init($logHandler, 15);
    class PayNotifyCallBack extends WxPayNotify
    {
        //查询订单
        public function Queryorder($transaction_id)
        {
            $input = new WxPayOrderQuery();
            $input->SetTransaction_id($transaction_id);
            $result = WxPayApi::orderQuery($input);
            Logwx::DEBUG("query:" . json_encode($result));
            if(array_key_exists("return_code", $result)
                && array_key_exists("result_code", $result)
                && $result["return_code"] == "SUCCESS"
                && $result["result_code"] == "SUCCESS")
            {
                return true;
            }
            return false;
        }
        
        //重写回调处理函数
        public function NotifyProcess($data, &$msg)
        {    
            Logwx::DEBUG("call back:" . json_encode($data));
            $notfiyOutput = array();
            
            if(!array_key_exists("transaction_id", $data)){
                $msg = "输入参数不正确";
                return false;
            }
            //查询订单,判断订单真实性
            if(!$this->Queryorder($data["transaction_id"])){
                $msg = "订单查询失败";
                return false;
            }
            //通过$data['out_trade_no'],在这里处理订单状态
            
            return true;
        }
    }
    $xml = $GLOBALS['HTTP_RAW_POST_DATA']; //微信返回的数据,格式(XML)
    Logwx::DEBUG("begin notify");
    Logwx::DEBUG("xml:".$xml);
    $notify = new PayNotifyCallBack();
    $notify->Handle(false);
  • 相关阅读:
    《Android 4游戏高级编程(第2版)》书评
    push研究——Apache Mina探索初步
    Android UI开发第二十三篇——分享书架UI实现
    cookie学习总结
    Web.xml配置详解
    Java序列化的机制和原理
    Java高级技术(汇总中...)
    [Java]HashMap的两种排序方式
    jdk与jre的区别
    DM,NLP常用算法汇总
  • 原文地址:https://www.cnblogs.com/freelyflying/p/6066704.html
Copyright © 2011-2022 走看看