微信支付,wechatpay,easywechat

现在微信大行其道,免不了需要搞微信开发。不过现在有神器了,easywechat.

用它来做 微信相关东西,节省大量时间。

首先第一个要求是你需要了解微信相关文档。

第二个要求 会装composer,网上教程一大把,官网也有。

其三 我们就可以动手了。

今天先讲微信支付

首先 安装easywechat,命令是composer require overtrue/wechat:~3.1 -vvv

然后在你的代码里面 加载autoload

<?php
require ("../../vendor/autoload.php");
use EasyWeChat\Payment\Order;
use EasyWeChat\Foundation\Application;
$options = [
    // 前面的appid什么的也得保留哦
    'app_id' => 'wx0a85ed6ac1xxxxx',
    'token'   => '',          // Token
    'aes_key' => '',                    // EncodingAESKey,安全模式下请一定要填写!!!
    'payment' => [
        'merchant_id'        => '148006xxxx',//商户id
        'key'                => 'C40M6Ia8mzCccccjxxxx',//支付密钥
        'notify_url'         => 'http://www.xxxxx.com/pay/wechat/callback.php',       // 你也可以在下单时单独设置来想覆盖它
    ],
];


$app = new Application($options);
$payment = $app->payment;

//扫码支付
$type="NATIVE";
//引入购物车类
require_once ("../../cart/checkout.php");
$order['title'] = '应付款'.$price;
$order['out_trade_no'] = $sn;
//测试金额
$price=0.01;
//微信的金额要乘以100的,回调 核验金额的时候 除以100 
$order['money'] = $price*100;

$attributes = [
    'trade_type'       => $type,
    'body'             => $order['title'],
    'out_trade_no'     => $order['out_trade_no'],
    'total_fee'        => intval($order['money']), // 单位:分
    //'notify_url'       => , // 支付结果通知网址,如果不设置则会使用配置里的默认地址
];


$order = new Order($attributes);
$result = $payment->prepare($order);
//下面这里是生成二维码
echo "<img src='http://www.xxxx.com/qqqr/create?qr={$result['code_url']}'>";

这个里面有几个注意点,商户后台的回调路径,这个通知路径

自己可以使用post 发送请求,先保留一次 微信请求自己的接口的数据,然后自己可以往这个接口请求数据,进行调试,这里给出回调接口的代码

require ("../../vendor/autoload.php");
use EasyWeChat\Foundation\Application;


$options = [
    // 前面的appid什么的也得保留哦
    'app_id' => 'wx0a85e',
    'token'   => '',          // Token
    'aes_key' => '',                    // EncodingAESKey,安全模式下请一定要填写!!!
    'payment' => [
        'merchant_id'        => '14800xxxx',
        'key'                => 'C40M6Ia8mzxxxx',
        'notify_url'         => 'http://www.xxxx.com/pay/wechat/callback',       // 你也可以在下单时单独设置来想覆盖它
    ],
];

$app = new Application($options);

$response = $app->payment->handleNotify(function($notify, $successful){
    // 你的逻辑 将微信请求的数据保存到这个里面 待会用来调试
file_put_contents('wp.txt',var_export($notify,true),8);
    $trade_no=$notify['out_trade_no'];
    $query = "update weixin_order set status=1 where sn='{$trade_no}'";
    if ($successful) {
        // 不是已经支付状态则修改为已经支付状态
        require ("../../config/config.php");
        mysqli_query($link,$query);
        if(mysqli_affected_rows($link)>0) return true;
        return false;
    } else { // 用户支付失败
       return false;
    }
    return true;
});

$response->send();

因为微信请求的是xml数据 下面给出测试回调接口的方法

//xml中数据换成你自己的,从这数据中有很多有意思的东西,
//比如说有没有关注,没关注的用户 你是不是可以推销一波呢,也可以记录下用户这行为
//
$xmlData = "
<xml><appid><![CDATA[wx0a85ed6xxxxx]]></appid>
<bank_type><![CDATA[CFT]]></bank_type>
<cash_fee><![CDATA[1]]></cash_fee>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<mch_id><![CDATA[1480061252]]></mch_id>
<nonce_str><![CDATA[59fc7bc834dd3]]></nonce_str>
<openid><![CDATA[ozio_ww6bZ0UYCNJbVoxxxxxx]]></openid>
<out_trade_no><![CDATA[20171103222304730005]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[2E1EF4FA36F7C02EEF7A93A8xxxx]]></sign>
<time_end><![CDATA[20171103222315]]></time_end>
<total_fee>1</total_fee>
<trade_type><![CDATA[NATIVE]]></trade_type>
<transaction_id><![CDATA[4200000012201711032999999]]></transaction_id>
</xml>";


$url = 'http://www.xxxx.com/pay/wechat/callback.php'; //接收xml数据的文件
$header[] = "Content-type: text/xml";      //定义content-type为xml,注意是数组
$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $xmlData);
$response = curl_exec($ch);
if(curl_errno($ch)){
    printcurl_error($ch);
}
curl_close($ch);
var_dump($response);

微信扫码方式 支付还是比较简单的,

其余的方式 有

H5 =》 wap网页吊起微信客户端中的微信支付, 需要单独申请

 jsapi=》微信app内吊起微信支付

app 内嵌sdk支付

后面这2种 中jsapi需要在公众号中设置获取到js安全域,拿到用户信息,发起支付的目录及回调域名都需要经过备案,还是挺严格的。

支付宝也有类似的,但是支付宝对发起目录 域名等等都没限制,只要签名对了,就容易了,

支付宝的支付方式

线下面对面交易(其实这样可以拿到一个二维码) 做成类似微信的扫码交易,这样不用去支付宝。

电脑网站交易,这个生成的链接会跳转到支付宝的网页里面。

手机wap  h5,有2种 一种是输入手机号,或者账号密码的,另外一种是吊起客户端的,。

app 内嵌sdk支付

另外本人提供 微信支付宝 接入指导及其他技术服务,价格美丽,有兴趣可以扫我支付宝 详聊

image.png

nickname
content