微信支付的方式有很多种,
1.JSAPI--公众号支付、
2.NATIVE--原生扫码支付、
3.APP--app支付,统一下单接口trade_type的传参可参考这里
4.MICROPAY--刷卡支付,刷卡支付有单独的支付接口,不调用统一下单接口
这里以 NATIVE 扫码支付为例进行介绍。
官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
1.开通支付权限,获取app_id等必须参数
2.按官方文档组织参数,生成URL
3.CURL等访问URL,获取XML返回值,成功则获得code_url,二维码的URL参数
4.根据code_url生成二维码,展示在用户前台,用户微信扫描后完成支付
5.自己系统的回调验证,完成支付交易
一.配置参数
/** * 组装包含支付信息的url(模式2) */ public function get_payurl() { require_once BASE_PATH.'/api/payment/wxpay/lib/WxPay.Api.php'; require_once BASE_PATH.'/api/payment/wxpay/WxPay.NativePay.php'; require_once BASE_PATH.'/api/payment/wxpay/log.php'; $logHandler= new CLogFileHandler(BASE_DATA_PATH.'/log/wxpay/'.date('Y-m-d').'.log'); $Logwx = Logwx::Init($logHandler, 15); //统一下单 $input = new WxPayUnifiedOrder(); $input->SetBody($this->_order_info['pay_sn'].'订单'); // $input->SetBody(C('site_name').'订单'); $input->SetAttach($this->_order_info['order_type'] == 'vr_order' ? 'v' : 'r'); $input->SetOut_trade_no($this->_order_info['pay_sn']); $input->SetTotal_fee($this->_order_info['api_pay_amount']*100); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 3600)); $input->SetGoods_tag(''); $input->SetNotify_url(SHOP_SITE_URL.'/api/payment/wxpay/notify_url.php'); $input->SetTrade_type("NATIVE"); //$input->SetOpenid($openId); $input->SetProduct_id($this->_order_info['pay_sn']); $result = WxPayApi::unifiedOrder($input); // header("Content-type:text/html;charset=utf-8"); // print_R($result);exit; Logwx::DEBUG("unifiedorder-:" . json_encode($result)); return $result["code_url"]; }
code_url是同步返回的结果,商户系统先调用该接口在微信支付服务后台生成预支付交易单
/** * 二维码显示(微信扫码支付) */ public function qrcodeOp() { $data = base64_decode($code_url); require_once BASE_RESOURCE_PATH.'/phpqrcode/phpqrcode.php'; QRcode::png($data); }
phpqrcode等相关代码下载见三。
通过返回的结果生成二维码,用户扫描支付后,走参数填写 notify_url 的回调地址
二.回调参数
回调就不做多阐述了,区分好return_code与result_code,
前者是调用结果,后者是本次调用执行的结果,是有区别的。
根据不同的返回结果,对应操作自己的逻辑即可。
三.注意事项
1.【基本信息设置】
商户向微信提交企业以及银行账户资料,商户功能审核通过后,可以获得帐户基本信息,找到本例程的配置文件「WxPay.pub.config.php」,配置好如下信息:
appId:微信公众号身份的唯一标识。审核通过后,在微信发送的邮件中查看。
Mchid:受理商ID,身份标识
Key:商户支付密钥Key。审核通过后,在微信发送的邮件中查看。
Appsecret:JSAPI接口中获取openid,审核后在公众平台开启开发模式后可查看。
2.【native支付链接设置】
native支付中,用户扫码后调微信会将productid和用户openid发送到商户设置的链接上,确保该链接与实际服务路径一致。本例程的响应服务为「./demo/native_call.php」
3.【JSAPI路径设置】
通过JSAPI发起支付的代码应该放置在商户设置的「支付授权目录」中。
并找到本例程的配置文件「WxPay.pub.config.php」,配置正确的路径。
4.【证书路径设置】
找到本例程的配置文件「WxPay.pub.config.php」,配置证书路径。
5.【异步通知url设置】
找到本例程的配置文件「WxPay.pub.config.php」,配置异步通知url。
6.【必须开启curl服务】
使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"即可。
7.【设置curl超时时间】
本例程通过curl使用HTTP POST方法,此处可修改其超时时间,默认为30秒。找到本例程的配置文件「WxPay.pub.config.php」,配置curl超时时间。
8. 除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。
9. 该接口 不需要证书
10. 微信的接口里,所有对金额的描述,都是以分为单位的
四.相关集成文档下载
封装文档:
二维码合成代码下载 : http://download.csdn.net/detail/ty_hf/9632186
支付源码文档下载 : http://download.csdn.net/detail/ty_hf/9632200
名称 | 描述 | 原因 | 解决方案 |
---|---|---|---|
NOAUTH | 商户无此接口权限 | 商户未开通此接口权限 | 请商户前往申请此接口权限 |
NOTENOUGH | 余额不足 | 用户帐号余额不足 | 用户帐号余额不足,请用户充值或更换支付卡后再支付 |
ORDERPAID | 商户订单已支付 | 商户订单已支付,无需重复操作 | 商户订单已支付,无需更多操作 |
ORDERCLOSED | 订单已关闭 | 当前订单已关闭,无法支付 | 当前订单已关闭,请重新下单 |
SYSTEMERROR | 系统错误 | 系统超时 | 系统异常,请用相同参数重新调用 |
APPID_NOT_EXIST | APPID不存在 | 参数中缺少APPID | 请检查APPID是否正确 |
MCHID_NOT_EXIST | MCHID不存在 | 参数中缺少MCHID | 请检查MCHID是否正确 |
APPID_MCHID_NOT_MATCH | appid和mch_id不匹配 | appid和mch_id不匹配 | 请确认appid和mch_id是否匹配 |
LACK_PARAMS | 缺少参数 | 缺少必要的请求参数 | 请检查参数是否齐全 |
OUT_TRADE_NO_USED | 商户订单号重复 | 同一笔交易不能多次提交 | 请核实商户订单号是否重复提交 |
SIGNERROR | 签名错误 | 参数签名结果不正确 | 请检查签名参数和方法是否都符合签名算法要求 |
XML_FORMAT_ERROR | XML格式错误 | XML格式错误 | 请检查XML参数格式是否正确 |
REQUIRE_POST_METHOD | 请使用post方法 | 未使用post传递参数 | 请检查请求参数是否通过post方法提交 |
POST_DATA_EMPTY | post数据为空 | post数据不能为空 | 请检查post数据是否为空 |
NOT_UTF8 | 编码格式错误 | 未使用指定编码格式 | 请使用NOT_UTF8编码格式 |
都很简单,就是调接口而已,注意的就是安全性的一些问题
比如说,对返回的code_url二维码信息,在传递的过程中注意加解密等