在线付款,有一个专用的函数进行封装好了微信与支付宝两种 举例子来讲解吧 ~~~ post_olpay([ 'money'=>10, 'return_url'=>url('endpay',['order_id'=>$orderid]), 'banktype'=>in_weixin() ? 'weixin' : 'alipay' , //在微信端,就用微信支付,否则就用支付宝支付 'numcode'=>'afds43q43dfdsfde', 'callback_class'=>mymd5("app\\shop\\model\\Order@pay@$orderid"), ],true); ~~~ 通过上面的函数,就可以实现在线支付. money 是 支付金额,单位元 return_url 支付成功后,返回到指定的网址 banktype 这一项,可以留空, 也可指定用支付宝或微信支付,上面是判断 在微信端,就用微信支付, 否则就用支付宝付款 . 都不设置,就可以让用户自己选择,留空才可以自由选择余额抵扣. numcode 订单号,可以为空 callback_class 服务端异步处理,就是说支付成功后,用户即使关闭了当前网页,服务端还可以实现后台异步处理数据. 如果不设置的话,用户关闭了当前网页.就不会进行异步处理数据. 会出现所谓的掉单. 所以推荐设置, 不设置也可以. post_olpay 函数的第二项设置为true的话,代表立即跳转到支付界面,设置为false的话,就返回支付网址,用户自己做跳转 callback_class 这一项再重点讲解一下 这里设置异步处理执行的类及方法.格式是 完整的 全路径类名比如 app\xxx\xxx\Order分隔符@方法名pay@参数$id 最后还要用mymd5函数进行加密处理,避免用户恶意修改 用户支付成功以后,就会给用户的余额充值, 用户帐户上有余额了, 再执行后续的相关操作. 所有财务操作,都是直接判断与处理用户的余额的. 实际上来说, 在线支付,就是给用户帐户充值, 所以上面的 money 参数 ,用户即使恶意修改,也没意义的. 因为他就对应给余额充值多少. 真正的应用逻辑处理,你要根据用户的余额进行判断处理. 余额不足就要中断. 余额充足的话, 就进行处理, 处理成功,就一定要扣余款 .切记切记!! 所以上面的 return_url 返回地址,也是不需要加密的, 因为最终处理数据的时候,是根据用户的余额做处理的. return_url 返回支付成功以后,处理的方法,可以跟 callback_class 共用一个类一个方法. 在那里做处理的时候,就跟据用户的余额是否足够进行处理. 处理成功后,必须要给数据库做个标志, 避免反复执行. 最后做个总结,就是在线支付,实际就是对用户的余额进行充值. 支付成功,就是充值成功 ,然后应用那里,就是对用户的余额进行判断,进行处理并扣余额, 最后还要给该订单做个已处理的标志, 避免反复处理. 在线支付实际就是给用户的余额充值, 用户余额充当中介作用. 应用的逻辑判断都是围绕余额进行的. 而余额的充值部分抛给了系统处理.不需要开发者考虑.开发者只须要判断用户余额是否足够展开做相关处理. 在支付成功后,处理的余额的时候, 还必须要用到扣余额的函数 add_rmb 比如 ~~~ add_rmb($order_info['uid'],-abs($order_info['pay_money']),0,'购物消费'); ~~~ 另外还有很关键的一点,就是判断当前用户,不能使用cookie的, 必须要跟上面传的参数id得到用户的uid,比如可以这样得到 通过`$id` 得到 `$uid` 再用函数 `get_user($uid)['rmb']` 得到用户的余额,进行判断处理, 余额充足,就执行处理,最后扣除相当的余额. 点击查看大图 [![](https://box.kancloud.cn/17f55305d6db2bdc2252bb9d4ec3dbdc_1301x712.jpg)](https://box.kancloud.cn/17f55305d6db2bdc2252bb9d4ec3dbdc_1301x712.jpg)