微信app支付,完整流程,完整代码 (转)

摘要:
微信应用程序支付过程所需的配置参数privatefunctionwechat($body,$indent_id,$cou,$user_id,$stotal_fee,$ip,$domain,$nonce_str){//微信配置信息和初始逻辑$appid=WxPayConfig::appid;//appid(微信开放平台的应用程序appid)$body=$body;//产品描述$mch_id=WxPayCon

微信app支付流程

需要的配置参数

private function wechat($body,$indent_id,$cou,$user_id,$total_fee,$ip,$domain,$nonce_str){ //微信配置信息和初始逻辑


$appid= WxPayConfig::APPID; //appid (微信开放平台的应用appid)


$body= $body; //商品描述


    $mch_id= WxPayConfig::MCHID; //商户号(注册商户平台时,发置注册邮箱的商户id)


$notify_url= ******; //回调地址(外部可访问的)


$out_trade_no= time(); //商户订单编号自定义

$ip = $ip;


$total_fee= $total_fee; //支付金额 分


$key = WxPayConfig::KEY;(商户平台api支付处设置的key)


$param = $this->signature($appid,$body,$mch_id,$nonce_str,$notify_url,$out_trade_no,$ip,$total_fee,$key);  //请求数据转码,xml格式 下文会有介绍      


$payment  = Payment::create([//插入预订单(这个对应数据库字段就行,根据自己情况来)

'indent_id'=> $indent_id, //订单id

   'coupon_id'=> $cou==null?0:$cou->id, //优惠券id

   'ordernum'=> $out_trade_no, 

   'user_id'=> $user_id, //用户id

   'update_time' => time(),

   'create_time'=> time(),

   'way'=> $body,

   'content' => 'APP马上拍【微信】'

]);

return $param;

}

2.请求数据组装成xml格式    

private function signature($appid,$body,$mch_id,$nonce_str,$notify_url,$out_trade_no,$ip,$total_fee,$key){ //支付请求数据组装

$stringA = "appid=$appid&body=$body&mch_id=$mch_id&nonce_str=$nonce_str&notify_url=$notify_url&out_trade_no=$out_trade_no&spbill_create_ip=$ip&total_fee=$total_fee&trade_type=APP";

$stringSignTemp = $stringA."&key=$key";


$sign  = strtoupper(md5($stringSignTemp)); //签名


$param = "<xml> ";

        

        $param .= "<appid>{$appid}</appid> ";

        

        $param .= "<body>{$body}</body> ";

        

        $param .= "<mch_id>{$mch_id}</mch_id> ";

        

        $param .= "<nonce_str>{$nonce_str}</nonce_str> ";

        

        $param .= "<notify_url>{$notify_url}</notify_url> ";

       

        $param .= "<out_trade_no>{$out_trade_no}</out_trade_no> ";

        

        $param .= "<spbill_create_ip>{$ip}</spbill_create_ip> ";

       

        $param .= "<total_fee>{$total_fee}</total_fee> ";

       

        $param .= "<trade_type>APP</trade_type> ";

       

        $param .= "<sign>{$sign}</sign> ";

        

        $param .= "</xml>";


return $param;

}

3.统一下单,拿到需要的参数,并二次签名,(这一步,就可以拿到所有的字段,倒是后app请求的时候,返回给app就可以,app藉此可以调起app支付)  

private function unify_curl($param,$ip,$total_fee,$domain,$body,$timestamp){//统一下单(拿到微信临时会话id,二次签名组装,返回给app ,)

$xml = $this->post_curl("https://api.mch.weixin.qq.com/pay/unifiedorder",$param); //发起请求

$info = json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true); //数据结果解析


$appid= $info['appid'];//二次签名

$body= $body; //商品描述

$mch_id= $info['mch_id'];


$ip = $ip;


$key = WxPayConfig::KEY;


$prepay_id= $info['prepay_id'];


$noncestr = $info['nonce_str'];


$SignA =                 strtoupper(md5("appid=$appid&noncestr=$noncestr&package=Sign=WXPay&partnerid=$mch_id&prepayid=$prepay_id&timestamp=$timestamp&key=$key"));


$info['sign']= $SignA;


$info['timestamp'] = $timestamp;


return $info;

}

    

private function post_curl($url,$data,$agreement = 0){//curl远程请求

       

        $ch = curl_init();

        

        curl_setopt($ch, CURLOPT_URL, $url);

        

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        

        curl_setopt($ch, CURLOPT_HEADER, 0);

       

        if($agreement == 0){//0 https   1   http

            unset($_REQUEST['agreement']);

            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,$data);

       

        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');

       

        curl_setopt($ch, CURLOPT_TIMEOUT, 15);

       

        $result = curl_exec($ch);

       

        curl_close($ch);

        return $result;

    }

4.微信支付回调

function wechat_notify(){

$postStr  = @$GLOBALS["HTTP_RAW_POST_DATA"];

$getData = json_decode(json_encode(simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA)),true);

if (!empty($getData['result_code']) || $getData['result_code'] =='SUCCESS') {//如果支付成功

//你的业务逻辑

return 'SUCCESS';

        }

}


转载自:https://blog.csdn.net/qq_34629975/article/details/53609241 

免责声明:文章转载自《微信app支付,完整流程,完整代码 (转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇android模拟器的键盘技巧oracle的sqlnet.ora,tnsnames.ora,listener.ora三个配置文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

5+ App开发入门指南

HTML5 Plus应用概述 HTML5 Plus移动App,简称5+App,是一种基于HTML、JS、CSS编写的运行于手机端的App,这种App可以通过扩展的JS API任意调用手机的原生能力,实现与原生App同样强大的功能和性能。 HTML5 Plus规范 通过HTML5开发移动App时,会发现HTML5很多能力不具备。为弥补HTML5能力的不足,在...

App Crawler

Google官方出了一款App遍历工具App Crawler。 文档:https://developer.android.google.cn/training/testing/crawler App Crawler工具是Android Jetpack的一部分,它可自动的运行你的App,不需要编写或维护任何代码。 通过App Crawler运行App,自动...

【原生】CocosCreator apk打包发布 (APPABI、jsc、网易易盾、权限、app名称图标、包名、签名)

Cocos版本:2.4.4  一 打包apk 二 App ABi的勾选 三 加密脚本 四 网易易盾插件 五 其它问题 一 打包apk 在android studio中,选择生成带签名的apk  选择APK 选择Module处,选择你的项目。 然后如果已有签名jks文件则选择choose existing,并输入你的key store密码。  没有jks...

基于React Native的58 APP开发实践

React Native在iOS界早就炒的火热了,随着2015年底Android端推出后,一套代码能运行于双平台上,真正拥有了Hybrid框架的所有优势。再加上Native的优秀性能,让越来越多的公司在实际项目中一探究竟。58同城APP发布模块年代久远,一直计划进行重构以适应日益苛刻的用户体验,这个需求与我们在React Native上一探究竟的意愿一碰撞...

App接口如何保证安全

微信开发或者高德地图,百度地图什么的api要使用,使用之前都需要注册一个账号,然后系统会给你一个key,然后调用api的时候把key传给服务器。 平常公司内部开发项目时,直接用mvc为app客户端提供接口,没有做过验证。 本次为了安全,所以需要考虑解决下安全问题。咨询了同学,有人提出,自己定义一个加密字符串+实时的一个时间戳,对称加密。app每次请求接口,...

从网页监听Android设备的返回键

最近搞Android项目的时候,遇到一个比较蛋疼的需求,需要从Client App调用系统浏览器打开一个页面,进行杂七杂八的一些交互之后,返回到App。如何打开浏览器和如何返回App这里就不说了,有兴趣的童鞋可私下交流。 之所以说这个需求蛋疼,是因为Android有个物理返回键啊……返回键啊……键啊……啊…… 用户按下返回键后,预期应该跟点击页面上的返回键...