关于微信支付的流程问题,特别是对小白用户来说,那是真的一个“折腾”,如果没人带,或者没人指导,那再就……
网上文档一大堆,但如果不知道其中的逻辑,再多的文档,都是没用的。
直接说逻辑吧(以充值为例)
一、充值的例子
1、首先有个充值的页面。这个页面,可以让客户填写或选择充值的金额。然后有个提交按钮,把对应的充值金额提交到后台的某个方法,比如金额、用户的OpenID。
2、统一下单的页面,也就是微信所说的统一下单方法。这个页面里面,主要是让客户确认他的充值金额并提交。
这个页面对应的方法,要把客户的充值金额、微信OpenID配置到微信统一下单的JS参数配置里面。不多说,上代码。
$tools = new \JsApiPay();
//$openId = $tools->GetOpenid();
$input = new \WxPayUnifiedOrder();
$input->SetBody("进行支付"); // 商品描述 *
$payrecord_num = \WxPayConfig::MCHID.date("YmdHis");
$input->SetOut_trade_no($payrecord_num); // 商户订单号 *
$input->SetTotal_fee("$num"); // 总金额 *
$input->SetNotify_url("http://xjs.qhhpjy.com/home/weixin/payresult"); // 通知地址 *
$input->SetTrade_type("JSAPI"); // 交易类型 *
$input->SetOpenid($openId); // openid *
$order = \WxPayApi::unifiedOrder($input);
$jsApiParameters = $tools->GetJsApiParameters($order);
$this->assign("num",$num/100);
$this->assign('jsApiParameters',$jsApiParameters);
(1)微信支付的金额是以分来计算的。所以我们要把接收过来的充值金额乘以100。
(2)在这个地方,我们要进行入库操作,也就是把客户提交的数据入库,以便后续的操作。只是在数据入库时,我们要有一个字段对数据进行标记,比如pay_record_status为“未支付”。
(3)我们入库客户的充值数据时,要记得把金额转成元,除以100。这个具体要看自己怎么处理的数据了。
(4)要把支付单号一并入库,以便后续支付成功回调时的业务处理。
3、客户点击“统一下单页面”进行支付。用户支付后,逻辑上进入到“支付回调”,在支付回调中,我们要处理以下功能。
(1)接收来自微信服务器的回调数据。
(2)通过接收回调来的“商户订单号”来数据库查找相应的记录。
(3)如果此条记录的支付状态为“已支付”,则在业务上进行die掉,否则微信会发起多次回调请求,那就乱了。
(4)如果此条记录的支付状态为“未支付”,客户已经成功支付,则把此条记录的pay_record_status的值改为“已支付”。
(4)发送模板消息,通知客户已经充值成功。
其实这个里面,也有个如何处理微信发过来的回调数据的问题,我发关键代码喽。
$dataFromClient = $GLOBALS["HTTP_RAW_POST_DATA"];
$postObj = simplexml_load_string($dataFromClient, 'SimpleXMLElement', LIBXML_NOCDATA);
//微信支付单号
//$transaction_id = $postObj-> transaction_id;
//商户订单号
$out_trade_no = $postObj-> out_trade_no;
//付款人微信openid
$openid = $postObj-> openid;
//支付金额
$total_fee = $postObj-> total_fee;
$total_fee = $total_fee/100;
当然,每个人的处理方式不一样,这只是我的处理方式而已。希望能帮助到大家。