单笔收款
在收银台开发过程中,整理了微信单笔收款的整个项目流程,很实用哟,注意下面有些方法或者类需要引入微信cdk中的一些文件才能用。微信cdk可以去微信开发者文档自己去下载。
扫码支付
微信的扫码支付原理是请求微信接口,然后得到一个二维码地址供页面显示;当用户扫码支付成功时微信会根据用户所填的回调地址进行回调,注意回调的地址是本地服务器,要实现订单支付功能,保证支付完成订单改为已经支付状态。此时页面需要监控回调状态,如果订单支付那么要做相应的处理,显示支付成功或者其他的跳转。主要代码如下:
1. 二维码生成部分
require_once LIB_ROOT . '/external/wxpayv3/example/WxPay.NativePay.php'; $notify = new NativePay(); //统一下单 $input->SetTrade_type( "NATIVE" ); $ input->SetProduct_id( $params[ 'product_id' ] );//二维码中包含的商品ID $result = $notify->GetPayUrl( $input ); // var_dump($result); $url2 = $result["code_url"]; //返回二维码的信息 return( $url2 );
2. 异步回调部分
require_once LIB_ROOT . '/external/wxpayv3/lib/WxPay.Api.php'; require_once LIB_ROOT . '/external/wxpayv3/lib/WxPay.Notify.php'; $msg = "OK"; //调用微信支付回调的方法,检查签名,并返回数据 $result = WxpayApi::notify( $msg ); if( $result ) { //爱干啥干啥(验证金额以及支付结果支付时间是否超时等等) //返回给微信信息 Factory::writeStderr( "WXPAY_NOTIFY_OK : [ out_trade_no : {$result[ 'out_trade_no' ]}, trade_no : {$result[ 'transaction_id' ]} ]" . $msg ); $notify = new WxPayNotify(); $notify->SetReply( true, $msg, false );//$result( true/false) } else { Factory::writeStderr( "WXPAY_NOTIFY_ERROR : [ out_trade_no : {$result[ 'out_trade_no' ]}, trade_no : {$result[ 'transaction_id' ]} ]" .$ex->getMessage() ); $notify = new WxPayNotify(); $notify->SetReply( false, $ex->getMessage(), false );//$result( true/false) }
3.实时查询订单状态,支付了就会进行跳转或者其他操作,这一步主要是为了查看用户支付状态,用户支付了会在回调部分修改订单状态,此时就会是已经支付或者支付失败,页面会相应作出反应(这部分要根据需求,所以代码略)
微信公众号支付
微信公众号是在公众号的基础上进行操作,所以可以知道用户的openid(需要授权)进而识别用户,然后可以将付款做成按钮的形式点击之后就可以调用微信的jsapi来发起支付
jsapi调取部分
function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', jsApiParameters,//这个是个参数集,包括回调地址以及金额等等,需要用户自己生成 function(res){ // 使用以上方式判断前端返回:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 if(res.err_msg == "get_brand_wcpay_request:ok" ) { //这边可以跳转到支付成功的显示页面 alert('支付成功'); } //get_brand_wcpay_request:cancel 支付过程中用户取消 //get_brand_wcpay_request:fail 支付失败 else if( res.err_msg == "get_brand_wcpay_request:cancel" || res.err_msg == "get_brand_wcpay_request:fail" ) { alert('支付失败'); } WeixinJSBridge.log(res.err_msg); alert(res.err_code+res.err_desc+res.err_msg); } ); } function callpay() { if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } }
jsApiParameters(上部分的红色部分,就是生成的支付参数)的生成(通过php)
$tools = new JsApiPay(); $openId = $tools->GetOpenid(); //②、统一下单 $input = new WxPayUnifiedOrder(); $input->SetBody("test"); $input->SetAttach("test"); $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis")); $input->SetTotal_fee("1"); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag("test"); $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php"); $input->SetTrade_type("JSAPI"); $input->SetOpenid($openId); $order = WxPayApi::unifiedOrder($input); echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>'; printf_info($order); $jsApiParameters = $tools->GetJsApiParameters($order);
注意事项
代码调试阶段注意引入的文件是否正确,支付完成后要做相应的订单支付操作,失败要返回给微信false,并且记录日志。并且支付之前一定要验证订单的状态(过期或者已支付着重考虑),并且金额和订单金额一致。凡是涉及到金额问题一定要再三考虑。