如何使用easywechat开发微信支付功能

easywechat是神一样的存在。非常好用。希望大家都能转到这上面来。


用easywechat来开发微信支付功能,步骤如下:


一,需要有一个商品下单页面,页面上有你的商品的信息,还要有购买数量,和一个购买按钮。

        用户在这个页面浏览商品信息的时候,可以选择购买的数量,然后点击提交进入下一个页面。

       (这个页面,跟淘宝的商品购买页面一样。)


二,创建一个页面,接收上面一步提交来的数据,然后做如下计算 。


       1,根据商品ID或是提交来的商品信息,生成商品的参数数组。


$product = [
    'trade_type'       => 'JSAPI', // 微信公众号支付填JSAPI
    'body'             => '一盒火柴',
    'detail'           => '一盒火些',
    'out_trade_no'     => 'MYERPORDERID12345678', // 这是自己ERP系统里的订单ID,不重复就行。
    'total_fee'        => 8888, // 金额,这里的8888分人民币。单位只能是分。
    'notify_url'       => 'http://www.xxx.com/order_notify', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
    'openid'           => 'you-open-id', // 这个不能少,少了要报错。
    // ...  基本上这些参数就够了,或者参考微信文档自行添加删除。
];

        2,接下来,生成商品对象。


 $order = new Order($product);

        3,再接下来,要进行调用前计算了。


        $app = new Application(config('wechat'));
        $payment = $app->payment;
        $result = $payment->prepare($order); // 这里的order是上面一步得来的。 这个prepare()帮你计算了校验码,帮你获取了prepareId.省心。
        $prepayId = null;
        if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){
            $prepayId = $result->prepay_id; // 这个很重要。有了这个才能调用支付。
        } else {
            var_dump($result);
            die("出错了。");  // 出错就说出来,不然还能怎样?
        }
        $config = $payment->configForJSSDKPayment($prepayId); // 这个方法是取得js里支付所必须的参数用的。 没这个啥也做不了,除非你自己把js的参数生成一遍


        4,就快进入正题,但是,还没完。还要取得一个数据。


        $app = new Application(config('wechat'));
        $js = $app->js;  // 这个是jssdk里页面上需要用到的js参数信息。


        5,上面获得的$js 和 $config数据,要在页面里显示出来。

                注意,上面几步都不涉及显示,只是在生成页面显示所需要的数据。

                现在才需要把这些显示在页面上。


    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript" charset="utf-8">
        wx.config({{ <span style="font-family: Arial, Helvetica, sans-serif;">$js->config(array('chooseWXPay')) </span><span style="font-family: Arial, Helvetica, sans-serif;">}}); </span>
    </script>
    <script>
        $(function(){

            $(".btn-do-it").click(function(){
                wx.chooseWXPay({
                    timestamp: "{{$config['timestamp']}}", // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
                    nonceStr: '{{$config['nonceStr']}}', // 支付签名随机串,不长于 32 位
                    package: '{{$config['package']}}', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
                    signType: '{{$config['signType']}}', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
                    paySign: '{{$config['paySign']}}', // 支付签名
                    success: function (res) {
                        // 支付成功后的回调函数
                        if(res.err_msg == "get_brand_wcpay_request:ok" ) {
                            alert('支付成功。');
                            window.location.href="{{url("wechat/pay_ok")}}";
                        }else{
                            //alert(res.errMsg);
                            alert("支付失败,请返回重试。");
                        }
                    },
                    fail: function (res) {
                        alert("支付失败,请返回重试。");
                    }
                });
            });
        });
    </script>

        没错,只需要修改这些。


        再来理一个,第二步里,这个页面需要显示一个确认信息,比如商品的名称,和支付的总金额。

        页面上应该有一个按钮,用来触发支付(.btn-do-it)。

        页面里的js就是第5步里要显示的内容。



        总结:

        第一步,商品信息页面,用户选择购买数据,点购买,提交到第二步的确认页面。

        第二步的确认页面,根据商品信息,和微信配置信息,生成必要的支付数据,并显示购买确认信息,和一个支付按钮,

        用户点击支付按钮,发起支付。

        支付完成,提示用户,或转到相应页面。

        微信的开发团队提醒我们,请以微信的推送信息为准来处理订单,不然有可能人财两空。



-分隔-


product.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>一盒火柴</title>
</head>
<body>

<h1>一盒火柴</h1>

<div>
    卖火柴的小女孩,手里有一堆火柴。
</div>

<hr>

<div>
    <form name="form1" action="payment.php" method="post">
        <lable>数量:</lable>
        <input name="qty" value="1" />
        <input name="submit" type="submit" value="购买" />
    </form>
</div>

</body>
</html>


payment.php


<?php
use EasyWeChat\Foundation\Application;
use EasyWeChat\Payment\Order;

$product = [
    'body'             => '一盒火柴',
    'trade_type'       => 'JSAPI',
    'out_trade_no'     => 'ERP'.time(),
    'total_fee'        => 1,
    'notify_url'       => 'http://test.xxoo.com/wechat/notify/',
    'openid'           => $_SESSION['openid'],
    'attach'           => '卖火柴的小女孩',
];

$order = new Order($product);

$app = new Application(config('wechat'));
$js = $app->js;
$payment = $app->payment;
$result = $payment->prepare($order);
$prepayId = null;
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){
    $prepayId = $result->prepay_id;
} else {
    var_dump($result);
    die("出错了。");
}
$config = $payment->configForJSSDKPayment($prepayId);
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>购买支付</title>
</head>
<body>

<h1>一盒火柴</h1>

<div>
    <p>您购买了“一盒火柴”,总价格: 0.01元。</p>
    <p>数量:1盒。</p>
</div>

<hr>

<div>
    <input name="button" id="btnPay" type="button" value="支付" />
</div>




<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" charset="utf-8">
    wx.config({{ $js->config(array('chooseWXPay')) }});
</script>
<script>
    $(function(){

        $(".btn-do-it").click(function(){
            wx.chooseWXPay({
                timestamp: "{{$config['timestamp']}}", // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
                nonceStr: '{{$config['nonceStr']}}', // 支付签名随机串,不长于 32 位
                package: '{{$config['package']}}', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
                signType: '{{$config['signType']}}', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
                paySign: '{{$config['paySign']}}', // 支付签名
                success: function (res) {
                    // 支付成功后的回调函数
                    if(res.err_msg == "get_brand_wcpay_request:ok" ) {
                        alert('支付成功。');
                        window.location.href="{{url("wechat/pay_ok")}}";
                    }else{
                        //alert(res.errMsg);
                        alert("支付失败,请返回重试。");
                    }
                },
                fail: function (res) {
                    alert("支付失败,请返回重试。");
                }
            });
        });
    });
</script>
</body>
</html>


这些是伪代码,payment.php并没有对product.html传来的商品信息做处理。

其实只要看payment.php文件应该知道怎么做了。


其它就两点。a,获取$config,b, 自己写wx.chooseWXPay。

其它的看easywechat文档就行了。






-END-


  


<think>嗯,用户问的是EasyWeChat6微信支付V3的支付结果回调。我需要先回忆一下EasyWeChat这个PHP微信开发包的相关知识。EasyWeChat6是对应微信支付API V3的版本,而支付回调处理是微信支付中非常重要的一部分,确保商户能够接收到支付结果的通知。 首先,用户可能已经有一定的开发经验,但可能对回调处理的具体步骤不太清楚。我需要先介绍回调的基本概念,然后分步骤说明如何在EasyWeChat6中实现。需要包括配置路由、控制器处理、验证签名、处理业务逻辑以及响应微信服务器这些步骤。 接下来要考虑用户可能的疑问点,比如如何验证签名,如何处理解密后的数据,以及如何正确响应微信服务器。特别是微信支付V3的回调使用的是AES-GCM加密,需要用到平台证书解密,这一点需要详细说明,避免用户在这里出错。 另外,用户可能需要代码示例,所以需要提供具体的代码片段,比如路由定义、控制器的结构,以及处理回调的具体方法。同时,要强调在业务逻辑处理中需要检查订单状态、更新订单信息,并处理可能出现的异常情况,比如重复通知或者验签失败。 还要注意提醒用户注意事项,比如保证接口的幂等性,处理可能出现的网络问题导致的通知重试,以及日志记录的重要性。这些都是在实际开发中容易遇到的问题,提前说明可以帮助用户避免一些常见的坑。 最后,需要确认回答的结构是否清晰,是否覆盖了所有关键点,并且语言是否简洁明了,符合中文表达习惯。检查是否有遗漏的步骤,比如返回响应给微信服务器的格式是否正确,是否需要特定的XML结构或者JSON响应。在EasyWeChat6中,应该使用response方法返回成功或失败的响应,确保微信服务器能正确接收处理结果。</think>以下是关于EasyWeChat6微信支付V3支付结果回调的详细说明: ### 一、回调流程原理 1. 用户支付成功后,微信服务器会向商户预设的`notify_url`发送POST请求 2. 请求体包含加密的支付结果(JSON格式 + AES-GCM加密) 3. 商户服务器需要完成: - 验证签名确保请求来源可信 - 解密数据获取明文结果 - 处理业务逻辑(如更新订单状态) - 返回正确处理响应 ### 二、具体实现步骤 #### 1. 配置路由(以Laravel为例) ```php // routes/web.php Route::post('/pay/notify', [PayController::class, 'handleNotify']); ``` #### 2. 控制器处理方法 ```php use EasyWeChat\Pay\Application; class PayController extends Controller { public function handleNotify(Application $app) { // 获取微信请求 $server = $app->getServer(); try { // 验证并解密消息 $message = $server->serve(); // 处理业务逻辑 $this->processPayment($message); // 返回成功响应 return $server->respond(); } catch (\Exception $e) { // 记录错误日志 Log::error('支付回调异常:'.$e->getMessage()); // 返回失败响应 return response()->json( ['code' => 'FAIL', 'message' => $e->getMessage()], 500 ); } } private function processPayment(array $message) { // 示例订单处理逻辑 $order = Order::where('transaction_id', $message['transaction_id'])->first(); if (!$order) { throw new \Exception('订单不存在'); } if ($order->status === 'paid') { throw new \Exception('订单已处理,请勿重复操作'); } // 更新订单状态 $order->update([ 'status' => 'paid', 'paid_at' => now(), 'payment_data' => $message ]); } } ``` ### 三、关键点说明 1. **签名验证**: - 自动验证请求头`Wechatpay-Signature` - 依赖平台证书进行验签(需确保证书已配置) 2. **数据解密**: ```php // 解密后的数据结构示例 [ 'mchid' => '商户号', 'appid' => '应用ID', 'out_trade_no' => '商户订单号', 'transaction_id' => '微信支付订单号', 'trade_type' => '交易类型', 'trade_state' => '支付状态', 'trade_state_desc' => '状态描述', 'success_time' => '支付完成时间', 'amount' => [ 'total' => 订单总金额(分), 'payer_total' => 用户支付金额(分), 'currency' => 'CNY' ], 'payer' => [ 'openid' => '用户openid' ] ] ``` ### 四、注意事项 1. **接口幂等性**: - 需处理重复通知(建议通过transaction_id去重) - 微信会进行多次重试(间隔:10s/30s/1m/5m/10m/30m/1h/2h/6h) 2. **响应格式要求**: - 成功:HTTP 200状态码 + 空JSON对象 `{}` - 失败:非200状态码或返回错误信息 3. **调试建议**: ```bash # 使用wechatpaydebug工具验证 curl -X POST https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out_trade_no}/close \ -H "Content-Type: application/json" \ -d '{"mchid":"你的商户号"}' ``` 4. **安全建议**: - 启用HTTPS - 定期更新平台证书 - 验证支付金额与订单金额一致性 完整处理流程建议参考[微信支付官方文档](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_5.shtml)进行对照验证。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HOOLOO

技术分享,回馈社会,建设祖国。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值