tp接入微信支付

微信APP支付功能是我们常用的一个功能,接下来我们来对接APP的微信支付

业务范围
1.支付商品
2.开通会员
3.充值等
而电子支付也是应电子商务的存在。用来解决在上线购买的支付问题。

微信支付流程

1.选择接入模式 (商户平台申请)成为普通商户
2.参数申请 开放平台申请APPID ,商户号平台申请mchid
3.绑定APPID及mchid
4.配置API key API v3密钥主要用于平台证书解密、回调信息解密,具体使用方式可参见接口规则文档中证书和回调报文解密章节。请根据以下步骤配置API key:登录
微信商户平台,进入【账户中心 > API安全 > API安全】目录,点击【APIV3密钥】。
5.下载并配置商户证书,商户可登录微信商户平台,在【账户中心】->【API安全】->【API证书】目录下载证书
6.生成证书串
7. 详情可见 APP支付接入准备

tp框架接入微信支付

你好!有很多人在接入微信支付时无从下下手,那么在本篇文件,带你详细的了解并实现微信支付,废话不多说,咱们开始

官方文档(多观察文档,和现成的代码就会发现微信支付的套路其实并不难)

微信支付官方文档

配置

  //微信 支付配置
    'Wxpay_config' => array (
        'appid' => '',  //微信开放平台上的应用id
        'secret' => '',  //微信开放平台上的应用secret
        'mch_id' => '',  //微信申请成功之后邮件中的商户id
        'api_key' => '',  //商户秘钥在微信商户平台上自己设定的api密钥 32位
        'notify_url' => '', //支付回调地址
        'huiyuan_notify' => ''  //会员支付回调地址
    ),```

 /**
     * 获取预支付订单
     * $body            商品描述
     * $out_trade_no    商户订单号
     * $total_fee       总金额
     * $notify_url      异步回调地址
     */
 public function getPrePayOrder($body, $out_trade_no, $total_fee, $notify_url){
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

        $onoce_str = $this->getRandChar(32);

        $data["appid"] = config('app.Wxpay_config.appid');
        $data["body"] = $body;
        $data["mch_id"] = config('app.Wxpay_config.mch_id');
        $data["nonce_str"] = $onoce_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";
        $s = $this->getSign($data, false);
        $data["sign"] = $s;
        // halt($data);
        $xml = $this->arrayToXml($data);
        $response = $this->postXmlCurl($xml, $url);


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

        if ($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS'){  //成功
            $sign = $this->getOrder($res['prepay_id']);//二次签名
            return $sign;
        }else{
            return $res['return_msg'];
        }
    }
    
	//获取指定长度的随机字符串
    function getRandChar($length){
        $str = null;
        $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
        $max = strlen($strPol)-1;

        for($i=0;$i<$length;$i++){
            $str.=$strPol[rand(0,$max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
        }

        return $str;
    }

    /*
        获取当前服务器的IP
    */
    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;
    }
	/*
      生成签名
    */
    function getSign($Obj)
    {
        foreach ($Obj as $k => $v)
        {
            $Parameters[strtolower($k)] = $v;
        }
        //签名步骤一:按字典序排序参数
        ksort($Parameters);
        $String = $this->formatBizQueryParaMap($Parameters, false);
        //echo "【string】 =".$String."
";
//签名步骤二:在string后加入KEY $String = $String."&key=".config('app.Wxpay_config.api_key'); // echo "
";
//签名步骤三:MD5加密 $result_ = strtoupper(md5($String)); return $result_; } //将数组转成uri字符串 function formatBizQueryParaMap($paraMap, $urlencode) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if($urlencode) { $v = urlencode($v); } $buff .= strtolower($k) . "=" . $v . "&"; } $reqPar = ''; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff)-1); } return $reqPar; } //数组转xml function arrayToXml($arr) { $xml = ""; foreach ($arr as $key=>$val) { if (is_numeric($val)) { $xml.="<".$key.">".$val.".$key.">"; } else $xml.="<".$key.">.$val."]]>.$key.">"; } $xml.=""; return $xml; } //post https请求,CURLOPT_POSTFIELDS xml格式 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"."
"
; echo "错误原因查询
"
; curl_close($ch); return false; } } /** * XML转数组 * @param unknown $xml * @return mixed */ function xmlToArray($xml) { //将XML转为array $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $array_data; } //执行第二次签名,才能返回给客户端使用 public function getOrder($prepayId){ $data["appid"] = config('app.Wxpay_config.appid'); $data["noncestr"] = $this->getRandChar(32);; $data["package"] = "Sign=WXPay"; $data["partnerid"] = config('app.Wxpay_config.mch_id'); $data["prepayid"] = $prepayId; $data["timestamp"] = (string)time(); $s = $this->getSign($data, false); $data["sign"] = $s; return $data; }

异步回调方法

回调方法 我在里获取了订单号 对订单号修改了状态

//异步通知接口
    public function notifyandroid()
    {
     $verify_result = $this->verifyNotify();
       if ($verify_result['return_code']=='SUCCESS' && $verify_result['result_code']=='SUCCESS') {
       //执行业务逻辑
       		 $out_trade_no = $verify_result['out_trade_no'];
       		   if($res){
                exit('');
            }
       }else{
            exit('');
        }
    }
  1. 回调地址
  2. 码字不易,求点赞
  3. 如果任何侵权行为请联系管理员删除

你可能感兴趣的:(微信,thinkphp5,微信,php,thinkphp)