微信支付前后端php,微信前后端交互

发布时间:2022-11-30

本文目录一览:

  1. 微信支付 notify.php 更新订单代码怎么写
  2. 如何利用PHP实现 APP端微信支付功能
  3. 如何用PHP实现微信支付,求教。新手!说明详细点
  4. 微信公众号支付报跨域错误,后台是php
  5. 微信支付接口开发用php如何实现?
  6. 你好 !! PHP如何实现微信支付 求指教 新手!说清楚一点

微信支付 notify.php 更新订单代码怎么写

微信支付PHP开发:微信支付代码及获取支付成功;微信支付demo代码;

include_once("include/WxPayHelper.php"); //该文件 微信DEMO包中有,没有请到官网上下载
$commonUtil = new CommonUtil();
$wxPayHelper = new WxPayHelper();
$user_ip = $_SERVER["REMOTE_ADDR"];
$wxPayHelper->setParameter("bank_type", "WX");
$wxPayHelper->setParameter("body", "微信支付测试");
$wxPayHelper->setParameter("partner", "11111111");
$wxPayHelper->setParameter("out_trade_no", $commonUtil->create_noncestr());
$wxPayHelper->setParameter("total_fee", "1");
$wxPayHelper->setParameter("fee_type", "1");
$wxPayHelper->setParameter("notify_url", "");
$wxPayHelper->setParameter("spbill_create_ip", $user_ip);
$wxPayHelper->setParameter("input_charset", "UTF-8");

HTML代码示例

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta content="application/xhtml+xml;charset=UTF-8" http-equiv="Content-Type" />
    <meta content="no-cache,must-revalidate" http-equiv="Cache-Control" />
    <meta content="no-cache" http-equiv="pragma" />
    <meta content="0" http-equiv="expires" />
    <meta content="telephone=no, address=no" name="format-detection" />
    <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height" />
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
    <title>在线支付测试</title>
</head>
<script language="javascript">
function callpay() {
    WeixinJSBridge.invoke('getBrandWCPayRequest', <?php echo $wxPayHelper->create_biz_package(); ?>, function(res) {
        if (res.err_msg == "get_brand_wcpay_request:ok") {
            document.getElementById("zhifu").style.display = 'none';
            document.getElementById("successDiv").style.display = 'block';
        }
        WeixinJSBridge.log(res.err_msg);
    });
}
</script>
<body>
<div id="zhifu">
    <button type="button" onClick="callpay()">立即在线支付</button><br><br>
</div>
<div id="successDiv" style="display:none">
    <h1>支付成功</h1>
</div>
</body>
</html>

获取微信支付成功订单信息的方法

  1. 支付成功通知的内容可以使用 $_GET 获取订单信息
  2. $GLOBALS["HTTP_RAW_POST_DATA"] 代码获取
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$OpenId = $postObj->OpenId;

只有“notify_url”页面没有输出“success”,微信后台会自动按时间进行补单。重新发送支付成功的商品订单信息。 补单机制的间隔时间为:8s、10s、10s、30s、30s、60s、120s、360s、1000s。

调试代码示例

$order = $_GET;
$fp = fopen('api.txt', 'a+');
fwrite($fp, "\n _______GET________");
fwrite($fp, var_export($order, true));
fwrite($fp, "\n ________postObj________");
fwrite($fp, var_export($postObj, true));
fwrite($fp, '【 Now 】: ' . date("Y-m-d H:i:s") . "\n");
fclose($fp);

如何利用PHP实现 APP端微信支付功能

PHP后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付

传输给微信的参数要组装成XML格式发送

public function ToXml($data = array()) {
    if (!is_array($data) || count($data) == 0) {
        return '数组异常';
    }
    $xml = "";
    foreach ($data as $key => $val) {
        if (is_numeric($val)) {
            $xml .= "<$key>$val</$key>";
        } else {
            $xml .= "<$key>$val</$key>";
        }
    }
    $xml .= "";
    return $xml;
}

生成随机字符串

function rand_code() {
    $str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; //62个字符
    $str = str_shuffle($str);
    $str = substr($str, 0, 32);
    return $str;
}

生成签名

private function getSign($params) {
    ksort($params);
    foreach ($params as $key => $item) {
        if (!empty($item)) {
            $newArr[] = $key . '=' . $item;
        }
    }
    $stringA = implode("&", $newArr);
    $stringSignTemp = $stringA . "&key=************************";
    $stringSignTemp = MD5($stringSignTemp);
    $sign = strtoupper($stringSignTemp);
    return $sign;
}

生成预支付订单

public function wx_pay() {
    $nonce_str = $this->rand_code();
    $data['appid'] = 'wxdbc5dc*******';
    $data['mch_id'] = '1493*****';
    $data['body'] = "APP支付测试";
    $data['spbill_create_ip'] = $_SERVER['HTTP_HOST'];
    $data['total_fee'] = 1;
    $data['out_trade_no'] = time() . mt_rand(10000, 99999);
    $data['nonce_str'] = $nonce_str;
    $data['notify_url'] = '';
    $data['trade_type'] = 'APP';
    $data['sign'] = $this->getSign($data);
    $xml = $this->ToXml($data);
    $url = "";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    if (stripos($url, "https://") !== FALSE) {
        curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    } else {
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    }
    curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    $data = curl_exec($ch);
    if ($data) {
        curl_close($ch);
        $re = $this->FromXml($data);
        if ($re['return_code'] != 'SUCCESS') {
            json("201", '签名失败');
        } else {
            $arr = array(
                'prepayid' => $re['prepay_id'],
                'appid' => 'wxdbc5dc*****',
                'partnerid' => '14937****',
                'package' => 'Sign=WXPay',
                'noncestr' => $nonce_str,
                'timestamp' => time(),
            );
            $sign = $this->getSign($arr);
            $arr['sign'] = $sign;
            json('200', '签名成功', $arr);
        }
    } else {
        $error = curl_errno($ch);
        curl_close($ch);
        json('201', "curl出错,错误码:$error");
    }
}

将XML数据转换为数组

public function FromXml($xml) {
    if (!$xml) {
        echo "xml数据异常!";
    }
    libxml_disable_entity_loader(true);
    $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    return $data;
}

APP支付成功后,会调用你填写的回调地址

function wx_notify() {
    $xmlData = file_get_contents('php://input');
    $data = $this->FromXml($xmlData);
    $file = fopen('./log.txt', 'a+');
    fwrite($file, var_export($data, true));
    $sign = $data['sign'];
    unset($data['sign']);
    if ($sign == $this->getSign($data)) {
        if ($data['result_code'] == 'SUCCESS') {
            $arr = array(
                'pay_status' => 1,
            );
            $re = M('order')->where(['order_sn' => $data['out_trade_no']])->save($arr);
            if ($re) {
                echo '';
                exit();
            }
        } else {
            $file = fopen('./log.txt', 'a+');
            fwrite($file, "错误信息:" . $data['return_msg'] . date("Y-m-d H:i:s") . "\r\n");
        }
    } else {
        $file = fopen('./log.txt', 'a+');
        fwrite($file, "错误信息:签名验证失败" . date("Y-m-d H:i:s") . "\r\n");
    }
}

如何用PHP实现微信支付,求教。新手!说明详细点

以PHP语言为例,对微信支付的开发流程进行一下说明:

  1. 获取订单信息。
  2. 根据订单信息和支付相关的账号生成sign,并且生成支付参数。
  3. 将支付参数信息POST到微信服务器,获取返回信息。
  4. 根据返回信息生成相应的支付代码(微信内部)或是支付二维码(非微信内),完成支付。

微信公众号支付报跨域错误,后台是php

首先明确一个概念,微信接口并不是用ajax访问的。希望你是在后台使用curl的。 在以上前提下,此报错是因为你的后台没有设置响应首部字段导致。以下两种方式均可解决: 方式一: 在后台入口文件同级目录下 .htaccess 文件添加以下语句:

Header always set Access-Control-Allow-Origin "*"

方式二: 在被访问的PHP文件头部增加:

header("Access-Control-Allow-Origin: *");

微信支付接口开发用php如何实现?

你好。关于这个问题: 先进入开发者中心 -> 网页授权获取用户基本信息 -> 修改成你的测试域名。否则会出现 redirect_uri 参数错误。 微信支付接口现在也慢慢的像支付宝一样可以利用API接口来实现第三方网站(如pigcms)或应用进行支付了。 希望我的回答对您有用,望采纳~

你好 !! PHP如何实现微信支付 求指教 新手!说清楚一点

通知机制的实现,官方只有文档没有demo代码,对没搞过的人来说,需要花大量时间来做测试。 从文档上说的来看,微信每次通知过来的数据,结构比较复杂,是一个多段数据,除了要取出POST数据外,还要取其它的数据。 这里首先涉及到一个关于 php://input$_POST 取值的问题,简单列几点如下:

  1. Content-Type 取值为 application/x-www-form-urlencoded 时,PHP会将HTTP请求body相应数据会填入到数组 $_POST,填入到 $_POST 数组中的数据是进行 urldecode() 解析的结果。
  2. php://input 数据,只要 Content-Type 不为 multipart/form-data(该条件限制稍后会介绍)。那么 php://input 数据与HTTP entity body部分数据是一致的。该部分相一致的数据的长度由 Content-Length 指定。
  3. 仅当 Content-Typeapplication/x-www-form-urlencoded 且提交方法是POST方法时,$_POST 数据与 php://input 数据才是“一致”的(打上引号,表示它们格式不一致,内容一致)的。其它情况,它们都不一致。
  4. php://input 读取不到 $_GET 数据。是因为 $_GET 数据作为 query_path 写在HTTP请求头部(header)的PATH字段,而不是写在HTTP请求的body部分。
  5. php://input 碰到了 multipart/form-data,请查阅 RFC1867 对它的描述。multipart/form-data 也表示以POST方法提交表单数据,它还伴随了文件上传,所以会跟 application/x-www-form-urlencoded 数据格式不一样。它会以一种更合理的,更高效的数据格式传递给服务端。当 Content-Typemultipart/form-data 的时候,即便HTTP请求body中存在数据,php://input 也为空,PHP此时,不会把数据填入 php://input 流。所以,可以确定:php://input 不能用于读取 enctype=multipart/form-data 数据。
  6. Content-Typeapplication/x-www-form-urlencoded 时,php://input$_POST 数据是“一致”的,为其它 Content-Type 的时候,php://input$_POST 数据是不一致的。因为只有在 Content-Typeapplication/x-www-form-urlencoded 或者为 multipart/form-data 的时候,PHP才会将HTTP请求数据包中的body相应部分数据填入 $_POST 全局变量中,其它情况PHP都忽略。而 php://input 除了在数据类型为 multipart/form-data 之外为空外,其它情况都可能不为空。 以上转述这么多文字的意思,就是说,得用到这两种方式来读取微信传过来的数据。