微信扫码支付接口可以找出支付给谁了不

CodeIgniter框架集成微信扫码支付SDK
版本:CI3.0
微信扫码支付:模式二
下载官方demo:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
我是个小菜鸟,第一次研究这个,感觉无从下手,走了很多弯路后,也算是完成了。现分享下希望对大家有帮助。
首先下载官方demo,将文件当在libraries/ 并命名为 Wxpay。在ci配置文件config/ 下新建 wxpay_config.php 并完成配置。
wxpay_config.php
defined('BASEPATH') OR exit('No direct script access allowed');
* TODO: 修改这里配置为您自己申请的商户信息
* 微信公众号信息配置
* APPID:绑定支付的APPID(必须配置,开户邮件中可查看)
* MCHID:商户号(必须配置,开户邮件中可查看)
* KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)
* 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert
* APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置),
* 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=&lang=zh_CN
* @var string
$config['appid'] = '';
$config['mch_id'] = '';
$config['apikey'] = '';
$config['appsecret'] = '';
$config['sslcertPath'] =
APPPATH.'libraries/Wxpay/cert/apiclient_cert.pem';
$config['sslkeyPath'] = APPPATH.'libraries/Wxpay/cert/apiclient_key.pem';
在libraries/ 下新建 CI_Wechatpay.php 。
CI_Wechatpay.php
defined('BASEPATH') OR exit('No direct script access allowed');
// 加载微信支付
require_once APPPATH.'libraries/Wxpay/Wechatpay.php';
* 为CI扩展微信支付类
class CI_Wechatpay extends WechatPay {
在libraries/ 下新建Wechatpay.php &这是前辈封装好的。尽情的享用吧,其实这里已经把所以核心都封装起来了,所以demo中的文件只需要保留cert/ &logs/ 、但libraries/Wxpay/example/log.php 这个很有用,所以要把它放在Wxpay/下。
Wechatpay.php
_config = $
* JSAPI获取prepay_id
* @param $body
* @param $out_trade_no
* @param $total_fee
* @param $notify_url
* @param $openid
* @return null
public function getPrepayId($body,$out_trade_no,$total_fee,$notify_url,$openid) {
$data = array();
$data[&nonce_str&]
= $this-&get_nonce_string();
$data[&body&]
$data[&out_trade_no&] = $out_trade_
$data[&total_fee&]
$data[&spbill_create_ip&] = $_SERVER[&REMOTE_ADDR&];
$data[&notify_url&]
= $notify_
$data[&trade_type&]
= self::TRADETYPE_JSAPI;
$data[&openid&]
$result = $this-&unifiedOrder($data);
if ($result[&return_code&] == &SUCCESS& && $result[&result_code&] == &SUCCESS&) {
return $result[&prepay_id&];
$this-&error = $result[&return_code&] == &SUCCESS& ? $result[&err_code_des&] : $result[&return_msg&];
$this-&errorXML = $this-&array2xml($result);
private function get_nonce_string() {
return substr(str_shuffle(&abcdefghijklmnopqrstuvwxyz&),0,32);
* 统一下单接口
public function unifiedOrder($params) {
$data = array();
$data[&appid&] = $this-&_config[&appid&];
$data[&mch_id&] = $this-&_config[&mch_id&];
$data[&device_info&] = (isset($params['device_info'])&&trim($params['device_info'])!='')?$params['device_info']:
$data[&nonce_str&] = $this-&get_nonce_string();
$data[&body&] = $params['body'];
$data[&detail&] = isset($params['detail'])?$params['detail']://optional
$data[&attach&] = isset($params['attach'])?$params['attach']://optional
$data[&out_trade_no&] = isset($params['out_trade_no'])?$params['out_trade_no']:
$data[&fee_type&] = isset($params['fee_type'])?$params['fee_type']:'CNY';
$data[&total_fee&]
= $params['total_fee'];
$data[&spbill_create_ip&] = $params['spbill_create_ip'];
$data[&time_start&] = isset($params['time_start'])?$params['time_start']://optional
$data[&time_expire&] = isset($params['time_expire'])?$params['time_expire']://optional
$data[&goods_tag&] = isset($params['goods_tag'])?$params['goods_tag']:
$data[&notify_url&] = $params['notify_url'];
$data[&trade_type&] = $params['trade_type'];
$data[&product_id&] = isset($params['product_id'])?$params['product_id']://required when trade_type = NATIVE
$data[&openid&] = isset($params['openid'])?$params['openid']://required when trade_type = JSAPI
$result = $this-&post(self::URL_UNIFIEDORDER, $data);
private function post($url, $data,$cert = false) {
$data[&sign&] = $this-&sign($data);
$xml = $this-&array2xml($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
if($cert == true){
//使用证书:cert 与 key 分别属于两个.pem文件
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, $this-&_config['sslcertPath']);
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, $this-&_config['sslkeyPath']);
$content = curl_exec($ch);
$array = $this-&xml2array($content);
* 数据签名
* @param $data
* @return string
private function sign($data) {
ksort($data);
$string1 = &&;
foreach ($data as $k =& $v) {
if ($v && trim($v)!='') {
$string1 .= &$k=$v&&;
$stringSignTemp = $string1 . &key=& . $this-&_config[&apikey&];
$sign = strtoupper(md5($stringSignTemp));
private function array2xml($array) {
$xml = && . _EOL;
foreach ($array as $k =& $v) {
if($v && trim($v)!='')
$xml .= &&$k&& . PHP_EOL;
$xml .= &&;
private function xml2array($xml) {
$array = array();
$tmp = (array) simplexml_load_string($xml);
}catch(Exception $e){}
if($tmp && is_array($tmp)){
foreach ( $tmp as $k =& $v) {
$array[$k] = (string) $v;
* 扫码支付(模式二)获取支付二维码
* @param $body
* @param $out_trade_no
* @param $total_fee
* @param $notify_url
* @param $product_id
* @return null
public function getCodeUrl($body,$out_trade_no,$total_fee,$notify_url,$product_id){
$data = array();
$data[&nonce_str&]
= $this-&get_nonce_string();
$data[&body&]
$data[&out_trade_no&] = $out_trade_
$data[&total_fee&]
$data[&spbill_create_ip&] = $_SERVER[&SERVER_ADDR&];
$data[&notify_url&]
= $notify_
$data[&trade_type&]
= self::TRADETYPE_NATIVE;
$data[&product_id&]
= $product_
$result = $this-&unifiedOrder($data);
if ($result[&return_code&] == &SUCCESS& && $result[&result_code&] == &SUCCESS&) {
return $result[&code_url&];
$this-&error = $result[&return_code&] == &SUCCESS& ? $result[&err_code_des&] : $result[&return_msg&];
* 查询订单
* @param $transaction_id
* @param $out_trade_no
* @return array
public function orderQuery($transaction_id,$out_trade_no){
$data = array();
$data[&appid&] = $this-&_config[&appid&];
$data[&mch_id&] = $this-&_config[&mch_id&];
$data[&transaction_id&] = $transaction_
$data[&out_trade_no&] = $out_trade_
$data[&nonce_str&] = $this-&get_nonce_string();
$result = $this-&post(self::URL_ORDERQUERY, $data);
* 关闭订单
* @param $out_trade_no
* @return array
public function closeOrder($out_trade_no){
$data = array();
$data[&appid&] = $this-&_config[&appid&];
$data[&mch_id&] = $this-&_config[&mch_id&];
$data[&out_trade_no&] = $out_trade_
$data[&nonce_str&] = $this-&get_nonce_string();
$result = $this-&post(self::URL_CLOSEORDER, $data);
* 申请退款 - 使用商户订单号
* @param $out_trade_no 商户订单号
* @param $out_refund_no 退款单号
* @param $total_fee 总金额(单位:分)
* @param $refund_fee 退款金额(单位:分)
* @param $op_user_id 操作员账号
* @return array
public function refund($out_trade_no,$out_refund_no,$total_fee,$refund_fee,$op_user_id){
$data = array();
$data[&appid&] = $this-&_config[&appid&];
$data[&mch_id&] = $this-&_config[&mch_id&];
$data[&nonce_str&] = $this-&get_nonce_string();
$data[&out_trade_no&] = $out_trade_
$data[&out_refund_no&] = $out_refund_
$data[&total_fee&] = $total_
$data[&refund_fee&] = $refund_
$data[&op_user_id&] = $op_user_
$result = $this-&post(self::URL_REFUND, $data,true);
* 申请退款 - 使用微信订单号
* @param $out_trade_no 商户订单号
* @param $out_refund_no 退款单号
* @param $total_fee 总金额(单位:分)
* @param $refund_fee 退款金额(单位:分)
* @param $op_user_id 操作员账号
* @return array
public function refundByTransId($transaction_id,$out_refund_no,$total_fee,$refund_fee,$op_user_id){
$data = array();
$data[&appid&] = $this-&_config[&appid&];
$data[&mch_id&] = $this-&_config[&mch_id&];
$data[&nonce_str&] = $this-&get_nonce_string();
$data[&transaction_id&] = $transaction_
$data[&out_refund_no&] = $out_refund_
$data[&total_fee&] = $total_
$data[&refund_fee&] = $refund_
$data[&op_user_id&] = $op_user_
$result = $this-&post(self::URL_REFUND, $data,true);
* 下载对账单
* @param $bill_date 下载对账单的日期,格式:
* @param $bill_type 类型
* @return array
public function downloadBill($bill_date,$bill_type = 'ALL'){
$data = array();
$data[&appid&] = $this-&_config[&appid&];
$data[&mch_id&] = $this-&_config[&mch_id&];
$data[&bill_date&] = $bill_
$data[&bill_type&] = $bill_
$data[&nonce_str&] = $this-&get_nonce_string();
$result = $this-&post(self::URL_DOWNLOADBILL, $data);
* 获取js支付使用的第二个参数
public function get_package($prepay_id) {
$data = array();
$data[&appId&] = $this-&_config[&appid&];
$data[&timeStamp&] = time();
$data[&nonceStr&]
= $this-&get_nonce_string();
$data[&package&]
= &prepay_id=$prepay_id&;
$data[&signType&]
$data[&paySign&]
= $this-&sign($data);
* 获取发送到通知地址的数据(在通知地址内使用)
* @return 结果数组,如果不是微信服务器发送的数据返回null
is_subscribe
out_trade_no
商户订单号
result_code
return_code
trade_type
transaction_id
微信支付订单号
public function get_back_data() {
$xml = file_get_contents(&php://input&);
$data = $this-&xml2array($xml);
if ($this-&validate($data)) {
* 验证数据签名
* @param $data 数据数组
* @return 数据校验结果
public function validate($data) {
if (!isset($data[&sign&])) {
$sign = $data[&sign&];
unset($data[&sign&]);
return $this-&sign($data) == $
* 响应微信支付后台通知
* @param $return_code 返回状态码 SUCCESS/FAIL
* @param $return_msg
public function response_back($return_code=&SUCCESS&, $return_msg=null) {
$data = array();
$data[&return_code&] = $return_
if ($return_msg) {
$data[&return_msg&] = $return_
$xml = $this-&array2xml($data);
接下来我是在 controller/order.php 文件下封装个方法 这里也用到了log.php ,注意看使用方法。在调bug时非常好用。
* wxPay 微信支付接口
* @param $Id 订单ID
* @author lyne
public function wxPay($id){
require_once (APPPATH.'libraries/Wxpay/log.php');
//初始化日志
$logHandler= new CLogFileHandler(APPPATH.&libraries/Wxpay/logs/&.date('Y-m-d').'.log');
Log::Init($logHandler, 15);
// 查预先生成的订单信息
$this-&load-&model('order_model');
$o = $this-&order_model-&getMyOrderDetails($id);
// 调用微信扫码支付接口配置信息
$this-&load-&config('wxpay_config');
$wxconfig['appid']=$this-&config-&item('appid');
$wxconfig['mch_id']=$this-&config-&item('mch_id');
$wxconfig['apikey']=$this-&config-&item('apikey');
$wxconfig['appsecret']=$this-&config-&item('appsecret');
$wxconfig['sslcertPath']=$this-&config-&item('sslcertPath');
$wxconfig['sslkeyPath']=$this-&config-&item('sslkeyPath');
//由于此类库构造函数需要传参,我们初始化类库就传参数给他吧
$this-&load-&library('CI_Wechatpay',$wxconfig);
$param['body']=$o['goods_name']; //&商品名称(自行看文档具体填什么)&;
$param['attach']=$o['id']; // &我有个参数要传我就穿了个id过来,这里不要有空格避免出错&;
$param['detail']=$o['order_code'];
//&我填了商品名称加订单号&;
$param['out_trade_no']=$o['order_code']; //&商户订单号&;
$param['total_fee']=$o['order_amount']*100; //&金额,记得乘以100,微信支付单位默认分&;//如$total_fee*100
$param[&spbill_create_ip&] =$_SERVER['REMOTE_ADDR'];//客户端IP地址
$param[&time_start&] = date(&YmdHis&);//请求开始时间
$param[&time_expire&] = date(&YmdHis&, time() + 600);//请求超时时间 10分钟
$param[&goods_tag&] = urldecode('运费:') . $o['postage']; //商品标签,自行填写
$param[&notify_url&] = &http://&.$_SERVER['HTTP_HOST'].&/wxnotify/&; //自行定义异步通知url
$param[&trade_type&] = &NATIVE&;//扫码支付模式二
$param[&product_id&] = $o['goods_id']; //正好有产品id就传了个,看文档说自己定义
//调用统一下单API接口
$result=$this-&ci_wechatpay-&unifiedOrder($param);//这里可以加日志输出,
// 写入日志
log::debug(json_encode($result));
//成功(return_code和result_code都为SUCCESS)就会返回含有带支付二维码链接的数据
$data=array();
if (isset($result[&code_url&]) && !empty($result[&code_url&])) {//二维码图片链接
$data['wxurl'] = $result[&code_url&];
//这里传递商户订单号到扫码视图,是因为我想做跳转,根据商户号去查询订单是否支付成功,如果成功了就跳转,定时轮询微信服务器(这个谁有好的方法可以分享给我啊,表示感谢啦)
$data['orderno'] = $param['out_trade_no'];
// 写入日志
$this-&assign('time_expire',strtotime($param[&time_expire&])); //订单失效时间
$this-&assign('order_no',$data['orderno']);
$this-&assign('wxurl',urlencode($data['wxurl'])); // 获取到的二维码地址
$this-&display('wxpay/index.html');
view/wxpay/index.html
&!doctype html&
&meta charset=&utf-8&&
&meta http-equiv=&x-ua-compatible& content=&ie=8& /&
&title&微信支付&/title&
&p style=&margin-left: 10color:#556B2F;font-size:30font-weight:&&微信扫码支付测试&/p&&br/&
&img alt=&模式二扫码支付& src=&http://paysdk.weixin.qq.com/example/qrcode.php?data={{$wxurl}}& width=&150&/&
&input type=&hidden& name=&orderNo& value=&{{$order_no}}&&
&input type=&hidden& name=&timeExpire& value=&{{$time_expire}}&&
// 每3秒请求一次数据,然后判断,跳转
$(function(){
timestamp = Date.parse( new Date())/1000; // 当前时间戳
orderno = $(&input[name='orderNo']&).val(); // 订单编号
timeExpire = $(&input[name='timeExpire']&).val(); // 订单失效时间
start = setInterval(&checkstatus(orderno)&, 3000);
function checkstatus(order_no){
if(timestamp & timeExpire){
// 当前时间大于失效时间时,清除轮询
window.clearInterval(start);
// 这里调用wechatpay.php中的orderQuery接口查询订单状态
&span style=&white-space:pre&&
// 当返回值 &span style=&font-family: Arial, Helvetica, sans-&&trade_state == &SUCCESS&&/span&
这个时候可以修改你的订单状态了哦。
OK!说的很细了,大家应该成功了吧。 欢迎大家发现问题并提出!共同解决。3DM新闻,游戏库论坛3大版块!
微信虽然很方便,但也会存在一定的弊端。比如很多小伙伴在微信中用扫码付款功能时,可能就会出现不小心支付错误,把钱给错人的情况。那么如果我们也出现了这种情况,该怎么办呢?下面小编来教大家一招。
微信扫码支付付错款怎么办?
1、打开手机微信,找到微信支付,点击进入。
2、找到付款错误的那笔,点击查看详情,如图所示。
3、在详细交易记录里面选择联系方,如下图所示。
4、每笔付款只能进行一次留言请求,但是能否收到回复取决于对方,详细填写联系理由,直接发送就行了。
5、如果金额较多,我们可以进行投诉,如图所示。
6、我们选择一种投诉原因,系统提供了很多的投诉原因可供选择,选择后点击进入。
7、尽量详细描述受骗原因,以及记录和最为证据提交,等待官方的回复!
以上就是关于微信扫码支付付错款的详细解决方法介绍,希望对大家有帮助。
更多关于微信教程
CopyRight(C)
All Right Reserved 京ICP证号 京网文(-207号190被浏览48,012分享邀请回答52 条评论分享收藏感谢收起2210 条评论分享收藏感谢收起微信扫码支付的限制金额是多少?另每天有无使用次数限制?
全部答案(共2个回答)
卡的用户转账付款单笔单日限额200元,收款单笔单日限额3000元。超过限额后若想继续使用,需要添加一张银行卡,验证身份信息。
在“我”的个人信息中打开“我的银行卡”
选择需要修改限额的银行卡,下方即可查看该银行卡的客服电话
每月显示的就是你当月的交易额,每日的限额是由银行规定的,可能会在两万元以内
亲 我对这些不是太了解 但是给我的感觉原理是一样的
《赠人玫瑰手有余香,祝您好运一生一世,如果回答有用,请点“好评”,谢谢^_^!》
你的网银限制了单笔交易额度,打银行大话改一下就行了
答:  合户后的账户标识您可以直接拨打10086人工台,由人工台通过“账务关系查询”为您查询;您也可以选择到营业厅前台进行查询。
答: 中关村的官网上有的,你可以去看看。如果我的回答对你有帮助,请点击“有用”哦,谢谢了。
答: 电子商务现在的定义又大了很多,你上网按照“什么是电子商务”可以搜几天也看不完的各种解释。
我搞计算机14年了,我的理解是通过计算机和网络,将传统的商务电子化就是...
答: 中关村的官网上有的,你可以去看看。如果我的回答对你有帮助,请点击“有用”哦,谢谢了。
大家还关注
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415微信扫码支付+会员,支付不止于支付!微信扫码支付+会员,支付不止于支付!掌柜买单移动支付百家号支付+会员,大招啊!!!60天8万新会员,这家便利店就用一招,还不花钱。。。。便利店可以办会员了?意思是买瓶2块钱的饮料还要办个会员卡?说好的轻便、快捷、用完即走呢?我不听…事实上,现在便利店的数量越来越多,客源分流,竞争加剧,店与店之间也没有自己的特点,同质化严重。要想在激烈的竞争中脱颖而出,发展会员,提高顾客消费频次和黏性才是制胜的法宝。支付+会员,不会做怎么办???有腾讯微信支付服务商,怕什么?福建省恒大大网络科技有限公司,作为腾讯社交广告的亲密合作伙伴,拥有腾讯微信支付业务服务商资质,强大的技术团队,自主研发的收银助手和收银系统,市场经验丰富的直拓团队,兢兢业业的客服团队,帮助你更好的服务于商家,现面对全国地区寻找合作伙伴;公司服务包括:聚合支付扫码支付+微平台营销+朋友圈广告+小程序定制开发,用支付的理念,为商户提供一系列的行业解决方案;定期举行合作伙伴交流会议,更多的操作方案,更多的服务理念,更多的发展方向及时传递;有三家便利店就首先“吃了螃蟹”,在上海海鼎服务商的帮助下,青岛友客、厦门见福、长沙新佳宜三家连锁便利店率先接入了微信“支付+会员”,打造便利店专属的“轻”会员模式。其中友客便利店更在上线两个月后,没花一分钱,轻松招揽8万新会员。现在,友客便利店的会员能力所有便利店都可以轻松拥有,一起来看到底怎么玩。不花一分钱,8万会员咋来的?友客在接入微信“支付+会员”后,用户在门店使用微信支付消费后,可一键领取会员卡,告别传统实体会员卡填写资料的麻烦,也不需要任何物料或店员指引操作,实现从顾客到会员的高效转化。短短两个月时间,友客快速招募了8万会员,远超前几年会员积累的总和。离店了也能开卡,收银高峰无负担以前,就算顾客有开卡的意愿,看到纸质表格后常常失去耐心;而在顾客填写完表格后,店员手忙脚乱录入资料,后面只想买瓶水的排队顾客更是焦急。友客借助“支付+会员”方案,顾客在结账离开柜台后收到微信消息,提醒领取会员卡并自助入会,“异步开卡”不给收银高峰添加任何负担。巧设优惠,会员招募+复购一箭双雕除了快速招募会员,友客还通过会员开卡送礼、“微信支付会员周-满8减2”会员活动,激励顾客尽快二次消费,享受微信支付优惠,拉动复购。除此之外,便利店还可通过与品牌商合作、积分定期兑换、派发优惠券、集点等方式,有效吸引顾客,高效转化会员。(点击图片放大)友客“轻”会员模式的成功,得益于微信“支付+会员”能力的全面升级及开放范围的提升。其他心动的便利店也可以来效仿。商家接入微信“支付+会员”流程也非常简单,只需三步:step1:商家开通微信卡券功能,并制作会员卡;step2:开通微信支付;step3:商家可在公众平台直接设置“支付后赠卡”功能,同时商家和服务商都可通过接口配置该能力。目前该功能已经面向所有商户开放,不失为一种轻量而高效的会员运营思路。商家如何接入“支付+会员”能力对小编来说,楼下的便利店就是“深夜食堂”,零食、小吃、咖啡…总是能够满足我。你愿意办一张便利店会员卡吗?你和便利店又有怎样的故事?本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。掌柜买单移动支付百家号最近更新:简介:支付+会员+微平台营销+朋友圈广告供应商作者最新文章相关文章

我要回帖

更多关于 微信支付宝扫码合一 的文章

 

随机推荐