当今互联网之战的源头就是线上支付的竞争,颇有得支付者得"天下"的气势,那么支付背后的实现原理之一的——扫码枪支付今天小艾带你们一探究竟!!!

扫码支付的大致流程是这样的。收银系统扫商品码生成订单->等待用户展示付款码->扫码枪扫描用户付款码->等待第三方支付(微信/支付宝)返回的扣款状态完成订单;本人从事多年php开发工作,下面给大家展示下工作中封装好的微信扫码支付的案例。直接上代码

/*** Notes:门店扫码支付* User: 小艾* Time:下午 4:14* DATE:2020/12/9 0009*/
public function Scantopay(){$common = new Common();if (request()->isPost()){$authCode = input('authCode','');//用户付款码$payAmount = input('payAmount','');//订单支付金额$outTradeNo = input('outTradeNo','');//订单号$out_trade_no$payment_type = input('payment_type',1);//支付方式  1-微信  2-支付宝  3-现金支付$weixinpay = new Scantopay();if (!empty($authCode) && !empty($payAmount) && !empty($outTradeNo)){if($payment_type == 1){//调取微信扫码支付$data = $weixinpay->weixinpay($authCode,$payAmount,$outTradeNo);if($data['return_code']=='SUCCESS'){//订单支付成功扣除门店库存$result = $common->returnway(2000,'支付成功!',$data);return json_encode($result);}else{$result = $common->returnway(4001,'支付支付!',$data);return json_encode($result);}}elseif ($payment_type == 2){//调取支付宝扫码支付}}else{$result = $common->returnway(4001,'请求参数不能为空!',[]);return json_encode($result);}}else{$result = $common->returnway(4000,'请求方式有误!',[]);return json_encode($result);}}

直接调取上述类方法即可;其他文件代码整合如下修改自己的支付配置即可 :

<?php/*** 扫码支付* 提醒:提交支付请求后微信会同步返回支付结果(没有异步回调通知)。当返回结果为“系统错误”时,商户系统等待5秒后调用【查询订单API】,查询支付实际交易结果;当返回结果为“USERPAYING”时,商户系统可设置间隔时间(建议10秒)重新查询支付结果,直到支付成功或超时(建议30秒);*/
namespace app\api\controller;
use think\Controller;
use think\Db;
use think\Input;
use think\facade\Request;
use app\api\controller\Common;
header("Access-Control-Allow-Origin:*");
class Scantopay extends Controller{/*** @param $authCode//用户付款码* @param $payAmount//付款金额,单位:元* @param $outTradeNo//你自己的商品订单号* @return array*/public function weixinpay($authCode,$payAmount,$outTradeNo){header('Content-type:text/html; Charset=utf-8');$mchid = '';          //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送$appid = '';  //公众号APPID 通过微信支付商户资料审核后邮件发送$apiKey = '';   //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥$orderName = '微信支付';    //订单标题$wxPay = new WxpayService($mchid,$appid,$apiKey);$wxPay->setTotalFee($payAmount);$wxPay->setOutTradeNo($outTradeNo);$wxPay->setOrderName($orderName);$wxPay->setAuthCode($authCode);$arr = $wxPay->createJsBizPackage();return $arr;}
}class WxpayService
{protected $mchid;protected $appid;protected $apiKey;protected $totalFee;protected $outTradeNo;protected $orderName;protected $authCode;public function __construct($mchid = '', $appid = '', $key = ''){$this->mchid = $mchid;$this->appid = $appid;$this->apiKey = $key;}public function setTotalFee($totalFee){$this->totalFee = $totalFee;}public function setOutTradeNo($outTradeNo){$this->outTradeNo = $outTradeNo;}public function setOrderName($orderName){$this->orderName = $orderName;}public function setAuthCode($authCode){$this->authCode = $authCode;}/*** 发起订单* @return array*/public function createJsBizPackage(){$config = array('mch_id' => $this->mchid,'appid' => $this->appid,'key' => $this->apiKey,'total_fee' => $this->totalFee,'out_trade_no' => $this->outTradeNo,'order_name' => $this->orderName,'auth_code' => $this->authCode,);//$orderName = iconv('GBK','UTF-8',$orderName);$unified = array('appid' => $config['appid'],'attach' => 'pay',             //商家数据包,原样返回,如果填写中文,请注意转换为utf-8'body' => $config['order_name'],'mch_id' => $config['mch_id'],'nonce_str' => self::createNonceStr(),'out_trade_no' => $config['out_trade_no'],'spbill_create_ip' => '127.0.0.1','total_fee' => intval($config['total_fee'] * 100),       //单位 转为分'auth_code' => $config['auth_code'],     //收款码,'device_info' => 'dedemao001',        //终端设备号(商户自定义,如门店编号)
//            'limit_pay'=>'no_credit'            //指定支付方式  no_credit--指定不能使用信用卡支付);$unified['sign'] = self::getSign($unified, $config['key']);$responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/micropay', self::arrayToXml($unified));$unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);if ($unifiedOrder === false) {die('parse xml error');}if ($unifiedOrder->return_code != 'SUCCESS') {die('支付失败:错误码:' . $unifiedOrder->err_code . '。错误码说明:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1#7');}if ($unifiedOrder->result_code != 'SUCCESS') {die('支付失败:错误码:' . $unifiedOrder->err_code . '。错误码说明:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1#7');}return (array)$unifiedOrder;}public function notify(){$config = array('mch_id' => $this->mchid,'appid' => $this->appid,'key' => $this->apiKey,);$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);if ($postObj === false) {die('parse xml error');}if ($postObj->return_code != 'SUCCESS') {die($postObj->return_msg);}if ($postObj->result_code != 'SUCCESS') {die($postObj->err_code);}$arr = (array)$postObj;unset($arr['sign']);if (self::getSign($arr, $config['key']) == $postObj->sign) {echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';return $postObj;}}/*** curl get** @param string $url* @param array $options* @return mixed*/public static function curlGet($url = '', $options = array()){$ch = curl_init($url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 30);if (!empty($options)) {curl_setopt_array($ch, $options);}//https请求 不验证证书和hostcurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);$data = curl_exec($ch);curl_close($ch);return $data;}public static function curlPost($url = '', $postData = '', $options = array()){if (is_array($postData)) {$postData = http_build_query($postData);}$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数if (!empty($options)) {curl_setopt_array($ch, $options);}//https请求 不验证证书和hostcurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);$data = curl_exec($ch);curl_close($ch);return $data;}public static function createNonceStr($length = 16){$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';$str = '';for ($i = 0; $i < $length; $i++) {$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);}return $str;}public static function arrayToXml($arr){$xml = "<xml>";foreach ($arr as $key => $val) {if (is_numeric($val)) {$xml .= "<" . $key . ">" . $val . "</" . $key . ">";} else$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";}$xml .= "</xml>";return $xml;}/*** 获取签名*/public static function getSign($params, $key){ksort($params, SORT_STRING);$unSignParaString = self::formatQueryParaMap($params, false);$signStr = strtoupper(md5($unSignParaString . "&key=" . $key));return $signStr;}protected static function formatQueryParaMap($paraMap, $urlEncode = false){$buff = "";ksort($paraMap);foreach ($paraMap as $k => $v) {if (null != $v && "null" != $v) {if ($urlEncode) {$v = urlencode($v);}$buff .= $k . "=" . $v . "&";}}$reqPar = '';if (strlen($buff) > 0) {$reqPar = substr($buff, 0, strlen($buff) - 1);}return $reqPar;}
}

下篇文章写支付宝的扫码枪实例!欢迎━(`∀´)ノ亻!探讨

微信收银扫码枪的实现原理你了解吗?相关推荐

  1. 微信支付正式推出“微信买单”功能 轻松实现微信收银

    今天,微信支付正式推出"微信买单"功能,商户无需开发,一分钟即可上线收款.同时,"微信买单"也面向服务商全面开放,服务商可以借助免开发的"微信买单&q ...

  2. 微信支付宝支付代理 微信扫码支付收银系统

    随着城市的多元化,中西结合,现代与古代文化的交融,人们的衣食住行也在发生着翻天覆地的变化,在10年前,出门消费都是现金或者刷卡.而现在你去购物都有会考虑一个问题:能不能用支付宝,微信支付?扫码支付已经 ...

  3. zbar扫描无法近距离扫码_生意好时最怕收银出故障,这几个扫码枪的常见问题你一定要知道...

    文|杭州丰收收 不怕生意不够好,就怕生意好时收银出故障. 这几天丰收收经常接到询问,说自己商铺所在的位置信号非常不好,很多客户等了很久没法付款,索性就不买了.看着上门的生意就这么走了,心里很不是滋味. ...

  4. web版收银系统,支持支付宝,微信扫描枪支付,数字输入

    Web版收银系统 这是一款web版的系统,可以在PC,平板,手机等多平台使用,支持微信,支付宝扫码支付,对接小程序订单,界面简洁明了,而且支持键盘输入. 在线测试地址:https://admin.zj ...

  5. 微信支付:如何打造移动支付时代的高可用收银系统?

    作者|商户运营开放团队 编辑|小智 移动支付时代,越来越多的人习惯于不带现金出门,许多支付场景只需要掏出手机就能完成.正因为如此,收银系统的可用性问题也越来越重要.如何打造移动支付时代的高可用收银系统 ...

  6. 扫码枪收银有手续费吗_生鲜店的收银系统应该如何选择?

    2020年可以说是生鲜水果店大力兴起的一年,几乎每条街道不到两公里就能看到一个,每个社区都有几个很不错的生鲜水果店.那么生鲜水果店的收银系统具体都有哪些功能需求,而不同规模的生鲜店又需要配置什么样的收 ...

  7. 超市自助收银系统的原理和应用优势,你了解多少呢?

    随着商超.便利店等零售门店向新零售转型,在门店的人力成本的投入也逐渐降低成本消耗,减少人工收银员,而是引进自助收银设备,辅助人工收银进行自助结算.那么,超市自助收银系统的原理和应用优势,你了解多少呢? ...

  8. 微信会员卡积分收银系统源码+搭建教程

    分享一个微信会员卡加积分加收银的系统源码,功能强大,非常好用,带完整搭建教程. 春哥超级会员卡积分系统源码商业运营版是一款专注于微信平台的会员卡应用源码,致力提供终端商家会员.收银.行业一站式解决方案 ...

  9. 【图像分类】没有人工收银,吃饭买单全自动化,是谁的功劳?

    不知道你是否已经发现 我们平常购买商品的时候 越来越少需要人工收银 笔者逛商场的时候 就特别喜欢去自助小餐厅 从选菜到结账 完全只需要自己参与 不仅减少了排队结算时间 还给吃饭带来了仪式感 自助收银 ...

  10. (WPF)连锁超市收银系统总结

    前言 好久没写博客了,如今做完了一个收银系统,静下心来做一个简单的总结.虽然收银系统各种各样,到处都有,开源的也不少,但是自己亲手做了一遍以后也收获颇丰.相比其他收银软件,功能上没什么创新,主要在于客 ...

最新文章

  1. linux:uabntu日常操作
  2. log4j源码阅读(一)之Logger
  3. [Jarvis OJ - PWN]——[XMAN]level0
  4. JAVA当中Calendar类打印日历表单
  5. 逆战选择服务器后显示器,让你的画面更流畅 逆战FPS值调节方法
  6. 从技术雷达看持续交付
  7. 微计算机cpu是指什么,微处理器和CPU的不同是什么
  8. 推荐一个磁盘清理工具
  9. QQ聊天记录删除了怎么恢复
  10. 霍华德大学计算机科学,霍华德大学有哪些专业
  11. 好记性不如烂笔头,要保持学习
  12. 手机用计算机微信运动记步吗,微信运动怎么开启 微信运动开启计步功能教程...
  13. C 不常见的一些晦涩语法
  14. wpf初学者-wpf控件简单介绍
  15. 柯达i2400批量自动扫描仪 JoySailScan控件转出的Base64尾部永远多一个'/',将导致解码失败
  16. excel 模拟分析 - 单变量求解模拟运算表
  17. 我在b站学数据库 (七):多表操作
  18. 烽火通信科技股份有限公司
  19. 飞桨领航团AI达人创造营课程笔记Lesson_2:数据集的获取与处理(CV方向)
  20. java入门之 美图相机(原图、灰度、二值化、马赛克、融合、轮廓获取)

热门文章

  1. echarts踩坑记录---仪表盘设置仪表盘的位置
  2. 12、vue-awsome-swiper与轮播图组件
  3. numpy部分函数使用总结
  4. 【数据科学】肯德尔等级相关系数( Kendall's tau coefficient )
  5. 信息搜索的基本技能总结
  6. 基于c语言编程思路的实践与探索,基于C语言编程思路的实践与探索
  7. Mac —— QuickTime录屏 声音小解决
  8. 我体验了禾多科技的自动驾驶汽车,离量产不远了!
  9. uniapp开发微信小程序,主包(分包超过限制)
  10. uni-app - 改变 <switch> 组件大小(开关太大)