在开发之中经常会使用到支付的功能,现在常用的两种支付方式是支付宝和微信。相对而言,支付宝的文档较为健全,并且配置和调用方式方式比较简单,这里就不过多的描述。
首先去微信官网网站下去下载服务端的demo:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php"htmlcode">
/* 微信APP下支付预下单 */
public function wxAppOrder(){
//TODO:首先获取订单详情,例如传递过来订单号或订单id,获取订单的详情信息,例如将取出的数据存放入$user_order_info数组,订单中包含的商品在$user_order_product_info之中。
/* 向微信发起请求 */
vendor('WxpayAPI.lib.WxPay','','.Api.php');
vendor('WxpayAPI.lib.WxPay','','.Data.php');//生成数据
//统一下单输入对象
$order_info= new WxPayUnifiedOrder();
$order_info->SetOut_trade_no($user_order_info['orderNo']);//商品订单号
$body=$user_order_product_info['productName'];
// $body=iconv('UTF-8', 'ISO-8859-1', $user_order_product_info['productName']);
$order_info->SetBody($body);//商品描述
$order_info->SetTrade_type('CNY');//人民币
$order_info->SetTotal_fee(intval($user_order_info['sumPrice']*100));//总金额,以分为单位
$order_info->SetTrade_type('APP');//交易类型
$order_info->SetAppid(C('wxAPPID'));
$order_info->SetMch_id(C('wxMCHID'));
$order_info->SetNotify_url('你的回调地址');
$order_info->SetSign();
//进行统一支付
$wxpay=new WxPayApi();
$order_result=$wxpay->unifiedOrder($order_info);//统一下单
if ($order_result['return_code']=='FAIL') {
$arr=array(
'resultCode'=>'99',
'resultDesc'=>$order_result['return_msg'],
'resultObj'=>array(''=>''),
);
echo JSON($arr);
exit();
}
if ($order_result['result_code']=='SUCCESS') {
//预下单成功后,重新签名返回给移动端
$wxpay_result=new WxPayResults();
$timestamp=time();
$wxpay_result->SetData('appid', $order_result['appid']);
$wxpay_result->SetData('partnerid', $order_result['mch_id']);
$wxpay_result->SetData('prepayid', $order_result['prepay_id']);
$wxpay_result->SetData('timestamp', $timestamp);
$wxpay_result->SetData('noncestr', $order_result['nonce_str']);
$wxpay_result->SetData('package', 'Sign=WXPay');
// $wxpay_result->SetData('key', C('wxKEY'));
//上方注释的代码是再签名中必要的一步,只是这个包含在了微信demo的类中,如果像该项目中既有app支付,又有公众号支付,最好是注释类中代码,并自己写入
$resign_result=$wxpay_result->SetSign();
//处理返回数据
$result=array(
'appid'=>$order_result['appid'],//appid
'partnerid'=>$order_result['mch_id'],//商户号
'prepayid'=>$order_result['prepay_id'],//与支付id
'package'=>'Sign=WXPay',
'noncestr'=>$order_result['nonce_str'],
'timestamp'=>$timestamp,
'sign'=>$resign_result,
);
$arr=array(
'resultCode'=>'00',
'resultDesc'=>'成功',
'resultObj'=>$result,
);
echo JSON($arr);
exit();
}else{
$arr=array(
'resultCode'=>'99',
'resultDesc'=>'失败',
'resultObj'=>$order_result,
);
echo JSON($arr);
exit();
}
}
/* 微信支付回调函数 */
public function wxpayNotify(){
vendor('WxpayAPI.lib.Logwx','','.Log.php');//在回调中最好是引入日志进行记录,在这里因为Log类与thinkphp中的log类重复,需要进行处理
$handle=new CLogFileHandler('./Public/wxlog.txt');
$log=Logwx::Init($handle);
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];//获取数据
vendor('WxpayAPI.lib.WxPay','','.Api.php');
vendor('WxpayAPI.lib.WxPay','','.Data.php');
$wxpay=new WxPayApi();
$notify=new WxPayNotifyReply();
$result=WxPayResults::Init($xml);//获取数据并转换为数组
if ($result['return_code']=='SUCCESS' && $result['result_code']=='SUCCESS') {//此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断
//TODO:进行数据库操作的业务逻辑处理,假设其成功与否的数据为$res
if ($res) {
$log->INFO('订单:'.$result['out_trade_no'].'支付成功');
$notify->SetReturn_code('SUCCESS');
$notify->SetReturn_msg('OK');
$notify->SetSign();
}else{
$log->ERROR('微信支付失败');
$notify->SetReturn_code('FAIL');
$notify->SetReturn_msg('客户服务器错误');
}
}else{
$log->ERROR('微信回调返回错误');
$notify->SetReturn_code('FAIL');
$notify->SetReturn_msg('微信支付失败');
}
//返回微信端
$wxpay->replyNotify($notify->ToXml());
}
/* 微信公众账号下单
* 获取code等信息
* 跳转至获取信息
* */
public function wxPubOrder(){
//此流程中
$orderId=$_GET['orderId'];
//注意:此处如果想要回调成功,需要在微信公众平台设置回调域名
// print_r('Location:https://open.weixin.qq.com/connect/oauth2/authorize"appid"]);
$timeStamp = time();
$jsapi->SetTimeStamp("$timeStamp");
$jsapi->SetNonceStr(WxPayApi::getNonceStr());
$jsapi->SetPackage("prepay_id=" . $order_result['prepay_id']);
$jsapi->SetSignType("MD5");
$jsapi->SetPaySign($jsapi->MakeSign());
$order_result = $jsapi->GetValues();
// print_r($order_result);exit();
$arr=array(
'resultCode'=>'00',
'resultDesc'=>'成功',
'resultObj'=>$order_result,
);
echo JSON($arr);
exit();
}else{
$arr=array(
'resultCode'=>'99',
'resultDesc'=>'失败',
'resultObj'=>$order_result,
);
echo JSON($arr);
exit();
}
}
这就是一个支付的流程,在这之中会遇到很多问题,在此给出一个大多数会遇到的问题的解决方法的大概思路:
- 1、APP统一下单后数据返回给前端,前端调用报签名错误:首先验证自己的秘钥信息是否正确,要注意移动端和公众号的是不同的,而类拿着key又去重新签名,可以将微信官方提供的demo中的直接内部调用配置文件那里注释掉
- 2、在公众号获取openid的时候,显示跨域:这个解决参考YII2框架中对于\yii::$app->response->header,中的remove方法,将报头去掉即可。
- 3、对于微信支付的配置,包括公众号支付配置白名单、测试目录啥的就不过多说了,请自行搜索资料
过程中肯定还遇到很多问题,这里不一一写了,如果还有问题可以在评论中留言,大家一起讨论学习,共同进步。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]