微信中的get微信支付unifiedorderrresult里面的attach是什么意思

Thinkphp3.2整合微信支付
业务场景:
用户在网页上选定商品,然后生成QRcode,用户扫后付款返回信息给server。
用到的支付模式:
NATIVE模式二
服务端信息:
,Thinkphp3.2框架
1.文件整合
首先把官方提供的demo下下来:
下下来以后 把demo里面的WxPayPubHelper整个文件夹放到Thinkphp项目里面Vendor文件夹中,放置之后项目就可以通过Vendor(&WxPayPubHelper.文件名&)来调用里面的php文件(.php不需要加)
2.代码整合
模式二主要用到的是wxpay文件夹里面的native_dynamic_qrcode.php,notify_url.php和qrcode.js三个。
在配置文件中配置要用到的信息,包括微信号ID、微信号SECRET、商户ID、商户支付秘钥、证书的url路径、异步通知的URL
要注意的是:异步URL地址必须是PATHINFO模式,如果是参数模式的话会调用不了。同时还要在微信号上微信支付-&开发配置-&支付配置中填好相同的NOTIFY_URL
然后可以开始写自己的代码了
建一个新的controller(或者整合到你自己的controller里面,在这里我建立一个新的Pay模块里面用IndexController)
public function index(){
Vendor(&WxPayPubHelper.WxPayPubHelper&);
//使用统一支付接口
$unifiedOrder = new \UnifiedOrder_pub();
//设置统一支付接口参数
//设置必填参数
//appid已填,商户无需重复填写
//mch_id已填,商户无需重复填写
//noncestr已填,商户无需重复填写
//spbill_create_ip已填,商户无需重复填写
//sign已填,商户无需重复填写
$unifiedOrder-&setParameter(&body&,&贡献一分钱&);//商品描述
//自定义订单号,此处仅作举例
$timeStamp = time();
$out_trade_no = C('wxappid').&$timeStamp&;
$unifiedOrder-&setParameter(&out_trade_no&,&$out_trade_no&);//商户订单号
$unifiedOrder-&setParameter(&total_fee&,&1&);//总金额
$unifiedOrder-&setParameter(&notify_url&,C('NOTIFY_URL'));//通知地址
//var_dump(urlencode(C('NOTIFY_URL')));
$unifiedOrder-&setParameter(&trade_type&,&NATIVE&);//交易类型
//非必填参数,商户可根据实际情况选填
//$unifiedOrder-&setParameter(&sub_mch_id&,&XXXX&);//子商户号
//$unifiedOrder-&setParameter(&device_info&,&XXXX&);//设备号
//$unifiedOrder-&setParameter(&attach&,&XXXX&);//附加数据
//$unifiedOrder-&setParameter(&time_start&,&XXXX&);//交易起始时间
//$unifiedOrder-&setParameter(&time_expire&,&XXXX&);//交易结束时间
//$unifiedOrder-&setParameter(&goods_tag&,&XXXX&);//商品标记
//$unifiedOrder-&setParameter(&openid&,&XXXX&);//用户标识
$unifiedOrder-&setParameter(&product_id&,&1101&);//商品ID
//获取统一支付接口结果
$unifiedOrderResult = $unifiedOrder-&getResult();
var_dump($unifiedOrderResult);
//商户根据实际情况设置相应的处理流程
if ($unifiedOrderResult[&return_code&] == &FAIL&)
//商户自行增加处理流程
echo &通信出错:&.$unifiedOrderResult['return_msg'].&
elseif($unifiedOrderResult[&result_code&] == &FAIL&)
//商户自行增加处理流程
echo &错误代码:&.$unifiedOrderResult['err_code'].&
echo &错误代码描述:&.$unifiedOrderResult['err_code_des'].&
elseif($unifiedOrderResult[&code_url&] != NULL)
//从统一支付接口获取到code_url
$code_url = $unifiedOrderResult[&code_url&];
//商户自行增加处理流程
$this-&assign('code_url',$code_url);
$this-&assign(&unifiedOrderResult&,$unifiedOrderResult);
$this-&theme('default')-&display('Pay/index');
然后加上以上的代码,代码直接从demo里面抽出来的,主要就是通过Vender读到helper, 然后是前端部分:
查询订单状态
JS生成QR部分也是用demo的代码,主要就是督导qrcode.js然后接受到服务端返回的信息把QRcode生成出来,其他查询订单和退款功能这里不做演示了。
到这里就可以用http//你的网址/index.php/pay/index/index 访问看到你的支付QRcode了
当然还没结束,用户支付成功后要获取到微信服务端的异步通知信息,在IndexController中加入一个notify方法:
public function notify(){
//include_once(&./log_.php&);
//echo 'access';
Vendor(&WxPayPubHelper.WxPayPubHelper&);
//使用通用通知接口
$notify = new \Notify_pub();
//存储微信的回调
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$notify-&saveData($xml);
//验证签名,并回应微信。
//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
//尽可能提高通知的成功率,但微信不保证通知最终能成功。
// $this-&log_result(&【checkSign】:\n&.$notify-&checkSign().&\n&);
if($notify-&checkSign() == FALSE){
$notify-&setReturnParameter(&return_code&,&FAIL&);//返回状态码
$notify-&setReturnParameter(&return_msg&,&签名失败&);//返回信息
$notify-&setReturnParameter(&return_code&,&SUCCESS&);//设置返回码
$returnXml = $notify-&returnXml();
echo $returnX
// $this-&log_result(&【返回回调信息】:\n&.$returnXml.&\n&);
//==商户根据实际情况设置相应的处理流程,此处仅作举例=======
//以log文件形式记录回调信息
$this-&log_result(&【接收到的notify通知】:\n&.$xml.&\n&);
if($notify-&checkSign() == TRUE)
if ($notify-&data[&return_code&] == &FAIL&) {
//此处应该更新一下订单状态,商户自行增删操作
$this-&log_result(&【通信出错】:\n&.$xml.&\n&);
elseif($notify-&data[&result_code&] == &FAIL&){
//此处应该更新一下订单状态,商户自行增删操作
$this-&log_result(&【业务出错】:\n&.$xml.&\n&);
//此处应该更新一下订单状态,商户自行增删操作
$this-&log_result(&【支付成功】:\n&.$xml.&\n&);
//商户自行增加处理流程,
//例如:更新订单状态
//例如:操作
//例如:推送支付完成信息
确认 http://你的网址/index.php/pay/index/notify 可以访问到,这个地址就是前面提及到的NOTIFY_URL了,要跟微信支付配置保持一致。然后到这里为止就成功了,访问index出现QRcode然后用户扫描支付成功 微信服务端调用notify,还有一点要注意的是微信服务端异步调用notify在没接受到SUCCESS返回前都是继续发(目前设定是半小时8次),所以记得要返回SUCCESS哟(给出的代码已经返回了),然后最好就做好重复notify的冲突处理,例如判断订单是否被处理过了,避免订单被重复刷新。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'微信JSApi支付~集成到MVC环境后的最后一个坑(网上没有这种解决方案)
大叔第一人
之前写了关于微信的坑《微信JSApi支付~坑和如何填坑》,今天将微信的jsapi支付封装到了MVC环境里,当然也出现了一些新的坑,如支付参数应该是Json对象而不是Json字符串,这样也会应付引起get_bran
大叔第一人
之前写了关于微信的坑《微信JSApi支付~坑和如何填坑》,今天将微信的jsapi支付封装到了MVC环境里,当然也出现了一些新的坑,如支付参数应该是Json对象而不是Json字符串,这样也会应付引起“get_brand_wcpay_request:fail_invalid appid”这个大家都知道的异常,呵呵,解决方案网上说是“授权目录“,事实上,还有一种原因,那就是你的WeixinJSBridge.invoke方法里的参数应该是Json对象而不是字符串,这才是最重要的。
代码我们需要写成下面的格式
    //调用微信JS api 支付
function jsApiCall() {
var price = 1.0;
var no = '@Request.QueryString["orderNumber"]';
var action = '@Url.Action("Get")';
var openID = '@openID';
$.get(action, { price: price, orderNumber: no, openID: openID }, function (data) {
WeixinJSBridge.invoke('getBrandWCPayRequest', JSON.parse(data), function (res) {
WeixinJSBridge.log(res.err_msg);
alert(res.err_code + res.err_desc + res.err_msg);
对于我们封装成MVC后,由于MVC的路由将扩展名去除了,所以我们的授权目录也发生了变化,如Order/Pay这个页面,在收取时应该是http://域名/Order/Pay/,而之前的http://域名/Order/这个级别就不被认可了,这点也要注意一下。
还有一点要注册,如果你添加了测试授权目录,那必须要添加测试用的白名单,否则你的微信也测试不了。
大叔封装的MVC版的微信JSAPI支付
/// 构建支付处理类
public class JsApiImplement
public static string wxJsApiParam { } //H5调起JS API参数
/// 返回当前微信客户端的OpenId,每个客户端在每个公众号里的OpenId是唯一的
public static string GetOpenId()
JsApiPay jsApiPay = new JsApiPay(System.Web.HttpContext.Current);
jsApiPay.GetOpenidAndAccessToken();
Log.Debug("GetOpenId", "openid : " + jsApiPay.openid);
return jsApiPay.
/// JsApi返回微信支付的连接参数,这个方法需要前台UI页面调用,通常可以使用AJAX进行调用它
///订单金额
///业务的订单编号
public static string Send(int total_fee, string orderId, string openId)
//调用【网页授权获取用户信息】接口获取用户的openid和access_token
//jsApiPay.GetOpenidAndAccessToken();
JsApiPay jsApiPay = new JsApiPay(System.Web.HttpContext.Current);
jsApiPay.openid = openId;
Log.Debug("Send", "openid : " + jsApiPay.openid);
//若传递了相关参数,则调统一下单接口,获得后续相关接口的入口参数,微信的价格是分
jsApiPay.total_fee = total_
WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(orderId);
wxJsApiParam = jsApiPay.GetJsApiParameters();//获取H5调起JS API参数
Log.Debug("Send", "wxJsApiParam : " + wxJsApiParam);
catch (Exception ex)
Log.Error("Error", ex.Message);
return wxJsApiP
/// JsApi微信回调
public static void Notify(Action action)
var context = System.Web.HttpContext.C
ResultNotify resultNotify = new ResultNotify(context);
resultNotify.ProcessNotify(action);
对于使用者来说,也很简单,在页面上拿OpenId,之后把OpenId传到后台方法,拿到微信支付的参数对象(JSON对象),之后完成支付
&script type="text/javascript"&
//调用微信JS api 支付
function jsApiCall() {
$.get("/weixin/get", new { money: 1, order: '001', openId: 'test' }, function (data) {
WeixinJSBridge.invoke('getBrandWCPayRequest', JSON.parse(data), function (res) {
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);
jsApiCall();
希望大家一起来找各种坑,然后把坑填上,分享给大家!微信统一支付的传值问题求助
[问题点数:40分,结帖人freescy2002]
微信统一支付的传值问题求助
[问题点数:40分,结帖人freescy2002]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2014年11月 PHP大版内专家分月排行榜第三2014年6月 PHP大版内专家分月排行榜第三2014年4月 PHP大版内专家分月排行榜第三2014年2月 PHP大版内专家分月排行榜第三2013年11月 PHP大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 微信支付unifiedorder 的文章

 

随机推荐