珠海市横琴建设局网站,wordpress 图片备份,深圳专业网站设计公司价格,青岛 网站维护到这里#xff0c;准备工作就算完成了。支付流程步骤详解#xff1a;步骤1#xff1a;用户在商户APP中选择商品#xff0c;提交订单#xff0c;选择微信支付。这一步#xff0c;app将相关订单信息提交给商户步骤2#xff1a;商户后台收到用户支付单#xff0c;调用微信…到这里准备工作就算完成了。支付流程步骤详解步骤1用户在商户APP中选择商品提交订单选择微信支付。这一步app将相关订单信息提交给商户步骤2商户后台收到用户支付单调用微信支付统一下单接口。参见【统一下单API】。商户系统先调用该接口在微信支付服务后台生成预支付交易单返回正确的预支付交易回话标识后再在APP里面调起支付。步骤3统一下单接口返回正常的prepay_id再按签名规范重新生成签名后将数据传输给APP。参与签名的字段名为appIdpartnerIdprepayIdnonceStrtimeStamppackage。注意package的值格式为SignWXPay步骤4商户APP调起微信支付。api参见本章节【app端开发步骤说明】(与服务器接口无关)步骤5商户后台接收支付通知。api参见【支付结果通知API】步骤6商户后台查询支付结果。api参见【查询订单API】遇到的问题1 商户用于接收微信的支付通知链接是通过【统一下单API】中提交的参数notify_url设置如果链接无法访问商户将无法接收到微信通知不能带参数微信返回类型为postxml格式2 接收到支付通知首先要做签名验证防止数据泄漏导致出现“假通知”造成资金损失就是收到的参数除了sign字段之外的字段做签名之后与收到的sign比较。3 处理重复问题微信可能会多次返回信息要处理重复订单的问题主要是解决【统一下单API】的订单号4 另外5里面要对6进行验证验证无误才可以在商户端对订单支付状态进行修改防止假通知或误操作。上代码(步骤56的)/*** 通用通知接口demo* * 支付完成后微信会把相关支付和用户信息发送到商户设定的通知URL* 商户接收回调信息后根据需要设定相应的处理流程。** 这里举例使用log文件形式记录回调信息。*/require_once dirname(__FILE__)./log_.php;// include_once(./log_.php);require_once /xxxxxx.php;// include_once(../xxxxxx.php);//使用通用通知接口$notify new Notify_pub();//存储微信的回调$xml $GLOBALS[HTTP_RAW_POST_DATA];$notify-saveData($xml);//将微信的请求xml转换成关联数组以方便数据处理if (empty($data))return false;//验证签名并回应微信。//对后台通知交互时如果微信收到商户的应答不是成功或超时微信认为通知失败//微信会通过一定的策略(如30分钟共8次)定期重新发起通知//尽可能提高通知的成功率但微信不保证通知最终能成功。if($notify-checkSign() FALSE){//设置两个数组的字段值$notify-setReturnParameter(return_code,FAIL);//返回状态码$notify-setReturnParameter(return_msg,签名失败);//返回信息}else{$notify-setReturnParameter(return_code,SUCCESS);//设置返回码}$returnXml $notify-returnXml();echo $returnXml;//商户根据实际情况设置相应的处理流程此处仅作举例//以log文件形式记录回调信息$log_ new Log_();$log_namedirname(__FILE__)/notify_url.log;//log文件路径$log_-log_result($log_name,【接收到的notify通知】:\n.$xml.\n);if($notify-checkSign() TRUE){if ($notify-data[return_code] FAIL||empty($notify-data[return_code])) {//此处应该更新一下订单状态商户自行增删操作$log_-log_result($log_name,【通信出错】:\n.$xml.\n);}elseif($notify-data[result_code] FAIL||empty($notify-data[result_code])){//此处应该更新一下订单状态商户自行增删操作$log_-log_result($log_name,【业务出错】:\n.$xml.\n);}else{$check new OrderQuery_pub();if(!$check-createXml()){$msg 订单查询失败;$log_-log_result($log_name,订单查询失败:\n.time().\n);return false;}// if (empty($data[out_trade_no])){// // file_put_contents(/xxxxx/aaa.txt, 3);// return false;// }ksort($data);reset($data);$payment D(Payment)-getPayment(weixin);/* 检查支付的金额是否相符 *///商户逻辑}//签名验证$sign array();foreach ($data as $key $val) {if ($key ! sign) {$sign[] $key . . $val;}}$sign[] key . $payment[appkey];//用将sign元素拼接成字串$signstr strtoupper(md5(join(, $sign)));if ($signstr ! $data[sign]){$log_-log_result($log_name,【签名失败】:\n用于组件sign的数组为.$sign.\n);return false;}//商户对订单操作echo SUCCESS;$log_-log_result($log_name,【支付成功】:\n.$xml.time().\n);die();}//商户自行增加处理流程,//例如更新订单状态//例如数据库操作//例如推送支付完成信息}?如果你觉得有用的话顶一下吧 ^o^