java 微信支付 notifynotify怎么接收数据

微信支付V3版,用户支付成功后,微信发送通知给notify_url,文档没说notify_url应该返回什么给微信?
在V3版本中。与V2不同。V2时只需要返回一个
的字符串就可以了。在V3中,所有的提交及返回数据都为XML。如果你支付成功后。只需要在
1notify_url
中处理完你的业务数据及流程。给微信服务器返回一个xml文件即可。具体如下
& & &return_code&&![CDATA[SUCCESS]]&&/return_code&
& & &return_msg&&![CDATA[支付成功]]&&/return_msg&
以上信息在文档
14.2 通用通知接口中
1商户处理后同步返回给微信参数
来,拿好: https://pay./wiki/doc/api/jsapi.php?chapter=9_7
本文出自操他妈,转载时请注明出处及相应链接。
本文永久链接: /13205.html
Ɣ回顶部用户名:niceheart
文章数:54
评论数:14
访问量:111495
注册日期:
阅读量:1297
阅读量:3317
阅读量:455480
阅读量:1140093
51CTO推荐博文
& 这两天优化了一下支付宝支付和微信支付订单回调的问题,之前我们的订单都是用手动回调给服务器,现在改成支付宝和微信原生的异步回调,结果并没有像我们想象的那么简单,支付宝是很顺利的解决回调,用一般的方式接收即可,但是微信接收时用普通的接收方式是不行的必须用另一种方式,如下且看:&支付宝和微信的回调地址notifyUrl = RequestUrl.BASE_URL+"order/order_payment"+"?order_code="+orderC& 服务器端是PHP开发,因此此处以PHP为例:&&& 支付宝接收回调的方法&/**& & &* sCreater&& & &* function:订单支付完成后回写数据库(支付宝支付回调)& & &* @return json& & &*/& & public function actionOrder_payment(){& & & & $getData = $this-&_requestD& & & & parent::write_log('order/order_payment',$getData);& & & & if (empty($getData['order_code'])){& & & & & & $data = array(& & & & & & & & 'error_code' =& 1,& & & & & & & & 'error_msg' =& '参数错误',& & & & & & & & 'data' =& ''& & & & & & );& & & & & & parent::json_encode($data);& & & & }& & & & if (!empty($getData['trade_status']) || $getData['trade_status'] =='TRADE_SUCCESS') {& & & & & & LinshiOrderMaster::confirmPayment($getData['order_code'],$getData['price'],'2',$getData['trade_no']);& & & & & & $data = array(& & & & & & & & 'error_code' =& 0,& & & & & & & & 'error_msg' =& '支付成功',& & & & & & & & 'data' =& ''& & & & & & );& & & & & & parent::json_encode($data);& & & & }& & }&&& 支付宝服务器返回的数据{& &"_id": ObjectId("55ec4550c6fdc2f03d8b48c5"),& &"name": "order/order_payment",& &"server_url": "http://api.xxx.**/v1.5.4/order/order_payment",& &"accept_data": {& & &"order_code": "64",& & &"discount": "0.00",& & &"payment_type": "1",& & &"subject": "陈*梅",& & &"trade_no": "9256",& & &"buyer_email": "*********@qq.com",& & &"gmt_create": " 18:29:13",& & &"notify_type": "trade_status_sync",& & &"quantity": "1",& & &"out_trade_no": "257",& & &"seller_id": "1245",& & &"notify_time": " 21:53:20",& & &"body": "课程支付",& & &"trade_status": "WAIT_BUYER_PAY",& & &"is_total_fee_adjust": "Y",& & &"total_fee": "0.01",& & &"seller_email": "xxxpay@xxx.biz",& & &"price": "0.01",& & &"buyer_id": "5312",& & &"notify_id": "4e270bbaa6f2eac2c39e3q",& & &"use_coupon": "N",& & &"sign_type": "RSA",& & &"sign": "******4GyXJaugFZqoiRQ4DE5VOn/EQjohiCulI5jRuogGiFb7ncZv/FjgZVD00QrnDGxYT8+XUAKThAQ01kCEHJJMLKHMxix9NXdeh8thXcDRBX/MJOnc4C/J8tk+U1D4VwkL1c [...]"&& },& &"header": [& & && ],& &"time": "21:53:20"&}&&& 微信接收回调方法&/**& & &* sCreater: miki& & &* function:订单支付完成后回写数据库(微信支付回调)& & &* @return json& & &*/& & public function actionOrder_wx_payment(){& & & & $postStr &= $GLOBALS["HTTP_RAW_POST_DATA"];& & & & $getData = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);& & & & parent::write_log('order/order_wx_payment',$getData);& & & & if (empty($getData['order_code'])){& & & & & & $data = array(& & & & & & & & 'error_code' =& 1,& & & & & & & & 'error_msg' =& '参数错误',& & & & & & & & 'data' =& ''& & & & & & );& & & & & & parent::json_encode($data);& & & & }& & & & if (!empty($getData['result_code']) || $getData['result_code'] =='SUCCESS') {& & & & & & LinshiOrderMaster::confirmPayment($getData['order_code'],$getData['total_fee']/100,'1',$getData['transaction_id']);& & & & & & $data = array(& & & & & & & & 'error_code' =& 0,& & & & & & & & 'error_msg' =& '支付成功',& & & & & & & & 'data' =& ''& & & & & & );& & & & & & parent::json_encode($data);& & & & }& & }&&& 微信接口返回的数据{& &"_id": ObjectId("55ed2bcdc6fdc2c83d8b4e79"),& &"name": "order/order_payment",& &"server_url": "http://api.xxx.***/v1.5.4/order/order_payment",& &"accept_data": {& & &"appid": "wx8be381be5d594578",& & &"bank_type": "COMM_DEBIT",& & &"cash_fee": "1",& & &"fee_type": "CNY",& & &"is_subscribe": "N",& & &"mch_id": "",& & &"nonce_str": "9a3d46f63dfd8b0153ece4",& & &"openid": "*********YfgoQPliYWg",& & &"order_code": "58",& & &"out_trade_no": "5d79099fcdf499f12b4a",& & &"result_code": "SUCCESS",& & &"return_code": "SUCCESS",& & &"sign": "D2AD1EE0FAC2A94E0CE4",& & &"time_end": "37",& & &"total_fee": "1",& & &"trade_type": "APP",& & &"transaction_id": "9912"&& },& &"header": [& & && ],& &"time": "14:16:45"&}&&&&&&&注:& 1、回调地址之所以加了order_code="+orderCode,主要是便于更新订单的状态,并且支付宝和微信都会自动将我们带的参数插入到原生数据一起返回给我们的服务端;& 2、支付宝回调的方法只是普通的post接收即可;& 3、微信回调的方法用的关键代码在&&$postStr &= $GLOBALS["HTTP_RAW_POST_DATA"];& (1)支付成功通知的内容可以使用 & $_GET 获取订单信息& (2)接收微信后台发送过来的消息,该消息数据结构为XML,不是php默认的数据类型 & &&$postStr&= $GLOBALS["HTTP_RAW_POST_DATA"];& (3)使用simplexml_load_string() 函数将接收到的XML消息数据载入对象$postStr中。 &$getData = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);&&&总结:支付宝支付和微信支付回调的区别就在于他们回调的数据方式不一样,所以app服务端接收数据的方式也不一样,切记,写此博文方便大家不再走弯路,与君共享! 另外如果有jsp方面的还请大家一起分享,一起进步。&&&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)安心财富客户端,
一手掌握,马上有钱
您的当前位置: >
> 到处都是坑的微信支付V3之 微信支付回调页面
特此声明:以上企业信息来自互联网,本公司不对真实性负责。此信息为企业免费宣传展示。安心贷与以上企业无任何关联关系。(若需删除,请致电安心贷客服)
据上次到处都是坑的V3后很多园友在被虐了千百遍后终于跳转到了亲切的微信支付界面,但输入密码支付后却不知道怎么处理了,接下来补上支付后的处理流程。1html中根据前台支付后反馈信息成功与否跳转到据上次到处都是坑的微信支付V3后很多园友在被虐了千百遍后终于跳转到了亲切的微信支付界面,但输入密码支付后却不知道怎么处理了,接下来补上支付后的处理流程。1html中根据前台支付后反馈信息成功与否跳转到。据上次到处都是坑的微信支付V3后很多园友在被虐了千百遍后终于跳转到了亲切的微信支付界面,但输入密码支付后却不知道怎么处理了,接下来补上支付后的处理流程。1.html中根据前台支付后反馈信息成功与否跳转到相关页面if(res.err_msg=="get_brand_wcpay_request:ok"){//message:"微信支付成功!",window.location.replace("@Url.Content("~/WxPay/Success?ordercode=@(Model.order_no)"))}elseif(res.err_msg=="get_brand_wcpay_request:cancel"){//message:"已取消微信支付!"}2.支付开发教程(微信商户平台版)中下载微信支付接口文档及demo(公众账号).zip返回的参数参考接口文档中4.2.通用通知接口一节。通知URL是4.1节中提交的参数notify_url,支付完成后,微信会把相关和用户信息发送到该URL,商户需要接收处理信息。//支付回调页面publicActionResultnotice_url(){stringresultFromWx=getPostStr()//设置支付参数RequestHandlerpaySignReqHandler=newRequestHandler(null)WriteLog("微支付noticeresultFromWx="+resultFromWx)varres=XDocument.Parse(resultFromWx)//通信成功if(res.Element("xml").Element("return_code").Value=="SUCCESS"){if(res.Element("xml").Element("result_code").Value=="SUCCESS"){//交易成功paySignReqHandler.SetParameter("return_code","SUCCESS")paySignReqHandler.SetParameter("return_msg","OK")stringordecode=res.Element("xml").Element("out_trade_no").ValueBLL.ordersBll=newBLL.orders()try{if(Bll.Update(ordecode)){WriteLog("微支付交易成功="+ordecode)}else{WriteLog("微支付交易失败="+ordecode)}}catch(Exceptionex){WriteLog(ex,"微支付交易异常="+ordecode)}}else{paySignReqHandler.SetParameter("return_code","FAIL")paySignReqHandler.SetParameter("return_msg","交易失败")}}else{paySignReqHandler.SetParameter("return_code","FAIL")paySignReqHandler.SetParameter("return_msg","签名失败")}stringdata=paySignReqHandler.ParseXML()varresult=TenPayV3.Unifiedorder(data)WriteLog("微支付noticeresult="+result)returnView()}注意因此接收到成功支付后需要返回代码中红色的部分来提醒微信服务器已处理,否则会不断收到微信服务器的反馈。因此接收到成功支付后需要返回代码中红色的部分来提醒微信服务器已处理,否则会不断收到微信服务器的反馈。因此接收到成功支付后需要返回代码中红色的部分来提醒微信服务器已处理,否则会不断收到微信服务器的反馈。因此接收到成功支付后需要返回代码中红色的部分来提醒微信服务器已处理,否则会不断收到微信服务器的反馈。因此接收到成功支付后需要返回代码中红色的部分来提醒微信服务器已处理,否则会不断收到微信服务器的反馈。getPostStr()方法//获得Post过来的数据publicstringgetPostStr(){Int32intLen=Convert.ToInt32(Request.InputStream.Length)byteb=newbyteintLenRequest.InputStream.Read(b,0,intLen)returnSystem.Text.Encoding.UTF8.GetString(b)}现在前后台都打通了,主要还是要耐心调试,祝君好运~相关阅读:关于微信屏蔽淘宝页面的解决方法asp.net微信支付发起页面jsapi.aspxC#微信开发之旅(一)前言C#微信开发之旅(十一)V2发货接口C#微信开发之旅(十二)V2告警接口&维C#微信开发之旅(十三)V2订单查询&退C#微信开发之旅(三)基础类之WeiXinCC#微信开发之旅(四)AccessToken获取C#微信开发之旅(六)生成带参数的二维C#微信开发之旅(八)通过授权code以及
类型 产品名称 期限 预期收益率
实用理财工具
理财计算器
贷款计算器
信用卡计算器
理财频道入口
你可能也感兴趣
关注微信账号7294人阅读
微信 WeChatPay(2)
import java.io.StringR
import java.util.HashM
import java.util.I
import java.util.L
import java.util.M
import java.util.S
import java.util.SortedM
import java.util.TreeM
import javax.servlet.http.HttpServletR
import mons.lang.StringU
import org.apache.log4j.L
import org.jdom2.D
import org.jdom2.E
import org.jdom2.input.SAXB
import org.xml.sax.InputS
import com.jfinal.aop.B
import com.jfinal.ext.interceptor.POST;
import com.jfinal.plugin.activerecord.NestedTransactionHelpE
import com.jfinal.plugin.activerecord.tx.Tx;
import com.utils.MD5U
import comwechat.config.WeChatC
public class WeChatPayController extends BaseController {
private Logger logger = Logger.getLogger(getClass());
* 微信同步回调
* 返回结果.code=0:正常结束&br&
* 返回结果.code=1:传参错误&br&
* 返回结果.code=2:该账户已在其它设备上登录&br&
* 返回结果.code=3:已被封号&br&
* 返回结果.code=99:系统异常
* @param deviceId
* @param params
加密过的参数({deviceId 设备ID, userId 用户ID, historyId 充值履历ID, state
充值状态})
* @return 返回加密过的结果(null)
@Before({ POST.class, Tx.class, DecryptParamsInterceptor.class })
public void synchronous_notify() {
String userId = decryptParams.get(&userId&);
String deviceId = decryptParams.get(&deviceId&);
String transaction_id = decryptParams.get(&transaction_id&);
String state = decryptParams.get(&state&);
if (StringUtils.isEmpty(userId) || StringUtils.isEmpty(deviceId) || StringUtils.isEmpty(transaction_id) || StringUtils.isEmpty(state)) {
throw new ServiceException(1, &传参错误&);
if (!PayState.SUCC.equals(state) && !PayState.FAIL.equals(state)) {
throw new ServiceException(1, &传参错误&);
int int_userId = Integer.parseInt(userId);
checkUser(int_userId, deviceId);
Transaction transaction = common_Transaction(transaction_id, state);
if (RechargeState.SUCC.equals(state)) {
common_notify(transaction);
* @Description: 微信异步回调
* @param @throws UnsupportedEncodingException
* @return void
* @author ChenFeng
@Before(Tx.class)
public void asynchronousWeChat_notify() {
Transaction transaction = weChat_notify();
common_notify(transaction);
renderText(&success&);
} catch (ServiceException ex) {
logger.error(ex.getMessage());
if (ex.getCode() == 33) {
renderText(&success&);
renderText(&fail&);
throw new NestedTransactionHelpException(ex.getMessage());
private void common_notify(Transaction transaction) {
RechargeHistory rh = RechargeHistory.dao.lockById(transaction.getLong(&recharge_id&));
if (rh == null) {
throw new ServiceException(35, &没有发现对应充值履历(recharge_id=& + transaction.getInt(&recharge_id&) + &)&);
if (!RechargeType.WEIXIN.equals(rh.getStr(&type&))) {
throw new ServiceException(37, &非微信支付&);
rh.set(&state&, RechargeState.SUCC);
rh.set(&updater&, &WeChatPay&);
if (!rh.update()) {
throw new ServiceException(36, &充值履历状态更新失败&);
RechargePackage rp = RechargePackage.dao.findById(rh.getInt(&package_id&));
if (rp == null) {
throw new ServiceException(38, &充值套餐已不存在&);
User user = User.dao.lockById(rh.getInt(&user_id&));
if (user == null) {
throw new ServiceException(38, &支付用户已不存在&);
int recharge_rmb = user.getInt(&recharge_rmb&) + rh.getInt(&amount&);
UserLevel nul = UserLevel.dao.getNext(user.getInt(&level_id&));
if (nul != null && recharge_rmb &= nul.getInt(&min_rmb&)) {
UpLevel ul = new UpLevel();
ul.set(&user_id&, user.get(&id&));
ul.set(&up_time&, getNowTime());
ul.set(&level_id&, nul.get(&id&));
if (!ul.save()) {
throw new ServiceException(39, &升级失败&);
user.set(&level_id&, nul.get(&id&));
user.set(&recharge_rmb&, recharge_rmb);
user.set(&accum_diam&, user.getInt(&accum_diam&) + rp.getInt(&num&));
user.set(&resid_diam&, user.getInt(&resid_diam&) + rp.getInt(&num&));
if (!user.update()) {
throw new ServiceException(39, &充值失败&);
SysInfo si = SysInfo.dao.RM_RECHARGE);
if (si != null && StringUtils.isNotEmpty(si.getStr(&value&))) {
SysMsgService.getToken();
SysMsgService.publishTxtMsg(Integer.toString(user.getInt(&id&)), si.getStr(&value&));
@SuppressWarnings(&rawtypes&)
private Transaction weChat_notify() {
// 获取微信POST过来反馈信息
System.out.print(&微信支付回调获取数据开始&);
logger.debug(&微信支付回调获取数据开始&);
HttpServletRequest request = getRequest();
String inputL
String notityXml = &&;
while ((inputLine = request.getReader().readLine()) != null) {
notityXml += inputL
request.getReader().close();
} catch (Exception e) {
logger.debug(&xml获取失败:& + e);
throw new ServiceException(39, &xml获取失败!&);
System.out.println(&接收到的报文:& + notityXml);
logger.debug(&收到微信异步回调:&);
logger.debug(notityXml);
if(StringUtils.isEmpty(notityXml)){
logger.debug(&xml为空:&);
throw new ServiceException(39, &xml为空!&);
Map m = parseXmlToList2(notityXml);
String appid = m.get(&appid&).toString();
String bank_type = m.get(&bank_type&).toString();
String cash_fee = m.get(&cash_fee&).toString();
String fee_type = m.get(&fee_type&).toString();
String is_subscribe = m.get(&is_subscribe&).toString();
String mch_id = m.get(&mch_id&).toString();
String nonce_str = m.get(&nonce_str&).toString();
String openid = m.get(&openid&).toString();
String out_trade_no = m.get(&out_trade_no&).toString();
String result_code = m.get(&result_code&).toString();
String return_code = m.get(&return_code&).toString();
String sign = m.get(&sign&).toString();
String time_end = m.get(&time_end&).toString();
String total_fee = m.get(&total_fee&).toString();
String trade_type = m.get(&trade_type&).toString();
String transaction_id = m.get(&transaction_id&).toString();
SortedMap&Object, Object& parameters = new TreeMap&Object, Object&();
parameters.put(&appid&, appid);
parameters.put(&bank_type&, bank_type);
parameters.put(&cash_fee&, cash_fee);
parameters.put(&fee_type&, fee_type);
parameters.put(&is_subscribe&, is_subscribe);
parameters.put(&mch_id&, mch_id);
parameters.put(&nonce_str&, nonce_str);
parameters.put(&openid&, openid);
parameters.put(&out_trade_no&, out_trade_no);
parameters.put(&result_code&, result_code);
parameters.put(&return_code&, return_code);
parameters.put(&time_end&, time_end);
parameters.put(&total_fee&, total_fee);
parameters.put(&trade_type&, trade_type);
parameters.put(&transaction_id&, transaction_id);
String characterEncoding = &UTF-8&;
String mySign = createSign(characterEncoding, parameters);
System.out.println(&我
的签名是:& + mySign);
logger.debug(&我
的签名是:& + mySign);
logger.debug(&WeChat
的签名是:& + sign);
if (sign.equals(mySign)) {
System.out.println(&签名一致&);
logger.debug(&签名一致&);
System.out.println(&签名不一致&);
logger.debug(&签名不一致&);
throw new ServiceException(39, &签名不一致!&);
if (!&SUCCESS&.equals(result_code)) {
throw new ServiceException(31, &微信返回的交易状态不正确(result_code=& + result_code + &)&);
return common_Transaction(out_trade_no, RechargeState.SUCC);
@SuppressWarnings({ &rawtypes&, &unchecked& })
private static Map parseXmlToList2(String xml) {
Map retMap = new HashMap();
StringReader read = new StringReader(xml);
// 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
InputSource source = new InputSource(read);
// 创建一个新的SAXBuilder
SAXBuilder sb = new SAXBuilder();
// 通过输入源构造一个Document
Document doc = (Document) sb.build(source);
Element root = doc.getRootElement();// 指向根节点
List&Element& es = root.getChildren();
if (es != null && es.size() != 0) {
for (Element element : es) {
retMap.put(element.getName(), element.getValue());
} catch (Exception e) {
e.printStackTrace();
return retM
private Transaction common_Transaction(String transaction_id, String state) {
Transaction transaction = Transaction.dao.findById(transaction_id);
if (transaction == null) {
throw new ServiceException(32, &没有发现对应的交易流水账号(transaction_id=& + transaction_id + &)&);
if (RechargeState.SUCC.equals(transaction.getStr(&state&))) {
throw new ServiceException(33, &该交易流水状态已变更&);
transaction.set(&state&, state);
transaction.set(&updater&, &WeChatPay&);
if (!transaction.update()) {
throw new ServiceException(34, &交易流水状态更新失败&);
* 微信支付签名算法sign
* @param characterEncoding
* @param parameters
@SuppressWarnings(&rawtypes&)
public static String createSign(String characterEncoding, SortedMap&Object, Object& parameters) {
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();// 所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
if (null != v && !&&.equals(v) && !&sign&.equals(k) && !&key&.equals(k)) {
sb.append(k + &=& + v + &&&);
String key = WeChatConfig.
sb.append(&key=& + key);
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:58204次
积分:2082
积分:2082
排名:第18824名
原创:79篇
转载:19篇
评论:15条
(5)(4)(3)(1)(1)(2)(4)(3)(2)(9)(64)

我要回帖

更多关于 微信支付的notify url 的文章

 

随机推荐