微信支付非同步回撥,帶你解決微信支付的深坑
1.首先我們先下載微信支付的伺服器端demo
2.個檔案作用介紹
index.jsp 下單 payRequest.jsp 獲取微信支付prepay_id等。
重點我說說這個payNotifyUrl.jsp
-
<%@ page language=
"java" contentType=
"text/html; charset=GBK" pageEncoding=
"GBK"%>
-
<%@ page
import=
"com.tenpay.RequestHandler" %>
-
<%@ page
import=
"com.tenpay.ResponseHandler" %>
-
<%@ page
import
=
"com.tenpay.client.ClientResponseHandler" %>
-
<%@ page
import=
"com.tenpay.client.TenpayHttpClient" %>
-
<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
-
<%
-
//---------------------------------------------------------
-
//財付通支付通知(後臺通知)示例,商戶按照此文件進行開發即可
-
//---------------------------------------------------------
-
//商戶號
-
String partner =
"1900000109";
-
-
//金鑰
-
String key =
"8934e7d15453e97507ef794cf7b0519d";
-
-
//建立支付應答物件
-
ResponseHandler resHandler =
new ResponseHandler(request, response);
-
resHandler.setKey(key);
-
-
//判斷簽名
-
if(resHandler.isTenpaySign()) {
-
-
//通知id
-
String notify_id = resHandler.getParameter(
"notify_id");
-
-
//建立請求物件
-
RequestHandler queryReq =
new RequestHandler(
null,
null);
-
//通訊物件
-
TenpayHttpClient httpClient =
new TenpayHttpClient();
-
//應答物件
-
ClientResponseHandler queryRes =
new ClientResponseHandler();
-
-
//通過通知ID查詢,確保通知來至財付通
-
queryReq.init();
-
queryReq.setKey(key);
-
queryReq.setGateUrl(
"https://gw.tenpay.com/gateway/verifynotifyid.xml");
-
queryReq.setParameter(
"partner", partner);
-
queryReq.setParameter(
"notify_id", notify_id);
-
-
//通訊物件
-
httpClient.setTimeOut(
5);
-
//設定請求內容
-
httpClient.setReqContent(queryReq.getRequestURL());
-
System.out.println(
"queryReq:" + queryReq.getRequestURL());
-
//後臺呼叫
-
if(httpClient.call()) {
-
//設定結果引數
-
queryRes.setContent(httpClient.getResContent());
-
System.out.println(
"queryRes:" + httpClient.getResContent());
-
queryRes.setKey(key);
-
-
-
//獲取返回引數
-
String retcode = queryRes.getParameter(
"retcode");
-
String trade_state = queryRes.getParameter(
"trade_state");
-
-
String trade_mode = queryRes.getParameter(
"trade_mode");
-
-
//判斷簽名及結果
-
if(queryRes.isTenpaySign()&&
"0".equals(retcode) &&
"0".equals(trade_state) &&
"1".equals(trade_mode)) {
-
System.out.println(
"訂單查詢成功");
-
//取結果引數做業務處理
-
System.out.println(
"out_trade_no:" + queryRes.getParameter(
"out_trade_no")+
-
" transaction_id:" + queryRes.getParameter(
"transaction_id"));
-
System.out.println(
"trade_state:" + queryRes.getParameter(
"trade_state")+
-
" total_fee:" + queryRes.getParameter(
"total_fee"));
-
//如果有使用折扣券,discount有值,total_fee+discount=原請求的total_fee
-
System.out.println(
"discount:" + queryRes.getParameter(
"discount")+
-
" time_end:" + queryRes.getParameter(
"time_end"));
-
//------------------------------
-
//處理業務開始
-
//------------------------------
-
-
//處理資料庫邏輯
-
//注意交易單不要重複處理
-
//注意判斷返回金額
-
-
//------------------------------
-
//處理業務完畢
-
//------------------------------
-
resHandler.sendToCFT(
"Success");
-
}
-
else{
-
//錯誤時,返回結果未簽名,記錄retcode、retmsg看失敗詳情。
-
System.out.println(
"查詢驗證簽名失敗或業務錯誤");
-
System.out.println(
"retcode:" + queryRes.getParameter(
"retcode")+
-
" retmsg:" + queryRes.getParameter(
"retmsg"));
-
}
-
-
}
else {
-
-
System.out.println(
"後臺呼叫通訊失敗");
-
-
System.out.println(httpClient.getResponseCode());
-
System.out.println(httpClient.getErrInfo());
-
//有可能因為網路原因,請求已經處理,但未收到應答。
-
}
-
}
-
else{
-
System.out.println(
"通知簽名驗證失敗");
-
}
-
-
%>
-
就是上面的這程式碼。完全沒有用。檢視sdk原始碼才知道 這個非同步回撥是接收微信傳送的所有引數,然後排序 加密 驗籤。 最坑的是 微信 的引數根本不是通過的引數返回的。而是通過的流。所以這個太坑了。下面我把我修改過的原始碼發出來 幫助大家解決回撥問題。
首先是控制器
-
/**
-
* 非同步回撥介面
-
* @param request
-
* @param response
-
* @throws Exception
-
*/
-
@RequestMapping(value=
"/weixin_parent_notify.do",produces=
"text/html;charset=utf-8")
-
@ResponseBody
-
public String WeixinParentNotifyPage(HttpServletRequest request,HttpServletResponse response) throws Exception{
-
-
ServletInputStream instream = request.getInputStream();
-
StringBuffer sb =
new StringBuffer();
-
int len = -
1;
-
byte[] buffer =
new
byte[
1024];
-
-
while((len = instream.read(buffer)) != -
1){
-
sb.append(
new String(buffer,
0,len));
-
}
-
instream.close();
-
-
SortedMap<String,String> map = WXRequestUtil.doXMLParseWithSorted(sb.toString());
//接受微信的通知引數
-
Map<String,String> return_data =
new HashMap<String,String>();
-
-
//建立支付應答物件
-
ResponseHandler resHandler =
new ResponseHandler(request, response);
-
-
resHandler.setAllparamenters(map);
-
resHandler.setKey(ConstantUtil.PARTNER_KEY[
0]);
-
-
//判斷簽名
-
if(resHandler.isTenpaySign()){
-
if(!map.get(
"return_code").toString().equals(
"SUCCESS")){
-
return_data.put(
"return_code",
"FAIL");
-
return_data.put(
"return_msg",
"return_code不正確");
-
}
else{
-
if(!map.get(
"result_code").toString().equals(
"SUCCESS")){
-
return_data.put(
"return_code",
"FAIL");
-
return_data.put(
"return_msg",
"result_code不正確");
-
}
-
-
-
-
String out_trade_no = map.get(
"out_trade_no").toString();
-
String time_end = map.get(
"time_end").toString();
-
BigDecimal total_fee =
new BigDecimal(map.get(
"total_fee").toString());
-
//付款完成後,支付寶系統傳送該交易狀態通知
-
System.out.println(
"交易成功");
-
Map order = orderdao.PaymentEndGetOrderInfo(out_trade_no);
-
-
if(order ==
null){
-
System.out.println(
"訂單不存在");
-
return_data.put(
"return_code",
"FAIL");
-
return_data.put(
"return_msg",
"訂單不存在");
-
return WXRequestUtil.GetMapToXML(return_data);
-
}
-
-
int order_type = (
int) order.get(
"order_type");
-
boolean payment_status = (
boolean) order.get(
"payment_status");
-
int supplier_id = (
int) order.get(
"supplier_id");
-
-
BigDecimal p =
new BigDecimal(
"100");
-
BigDecimal amount = (BigDecimal) order.get(
"amount");
-
-
amount = amount.multiply(p);
-
-
//如果訂單已經支付返回錯誤
-
if(payment_status){
-
System.out.println(
"訂單已經支付");
-
return_data.put(
"return_code",
"SUCCESS");
-
return_data.put(
"return_msg",
"OK");
-
return WXRequestUtil.GetMapToXML(return_data);
-
}
-
-
-
//如果支付金額不等於訂單金額返回錯誤
-
if(amount.compareTo(total_fee)!=
0){
-
System.out.println(
"資金異常");
-
return_data.put(
"return_code",
"FAIL");
-
return_data.put(
"return_msg",
"金額異常");
-
return WXRequestUtil.GetMapToXML(return_data);
-
}
-
-
//更新訂單資訊
-
if(orderdao.PaymentEndUpdateOrder(out_trade_no, time_end)){
-
System.out.println(
"更新訂單成功");
-
//如果該訂單是幼兒產品 並且 存在代理
-
if(order_type ==
2){
-
if(supplier_id !=
0){
-
Map su = userdao.getSupplierInfo(supplier_id);
-
String phone = (String) su.get(
"phone_number");
-
String nickname = (String) su.get(
"nickname");
-
String app_token = (String) su.get(
"app_token");
-
-
String content =
"【三盛科創】尊敬的"+ nickname +
"您好。您在我們平臺出售的商品有新使用者下單。請您點選該連結檢視發貨資訊。"+Config.WEB_SERVER+
"/order/SupplierOrderInfo.do?order_number="+out_trade_no+
"&sid="+app_token+
".請您務必妥善包管。";
-
MessageUtil.SendMessage(phone,content);
-
}
-
}
else{
-
orderdao.UpdateOrderStatus(out_trade_no,
3);
//更新訂單為已完成
-
}
-
-
return_data.put(
"return_code",
"SUCCESS");
-
相關推薦
微信支付非同步回撥,帶你解決微信支付的深坑
1.首先我們先下載微信支付的伺服器端demo
2.個檔案作用介紹
index.jsp 下單 payRequest.jsp 獲取微信支付prepay_id等。
重點我說說這個payNotifyUrl.jsp
微信 支付非同步回撥 獲取引數值
import java.io.StringReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import
阿里App支付服務端介面開發(含後臺非同步回撥,退款)
1.引入相關包檔案
maven匯入方式:
<dependency>
<groupId>com.alipay</groupId>
<artifactId>sdk-java</artifactId>
<version>
程式設計師突發奇想,如何巧用設計模式來實現【聚合支付非同步回撥】
什麼是模版方法
1.定義了一個操作中的演算法的骨架,而將部分步驟的實現在子類中完成。
模板方法模式使得子類可以不改變一個演算法
支付寶支付非同步回撥 302
APP從測試環境遷移到生產環境,重新測試發現購買時,支付寶支付成功之後,訂單狀態未更新,即非同步回撥介面未執行。檢查發現notify_url是正確的,並且已經支付成功(賬戶有被扣款),登入螞蟻金服開放平臺:https://openmonitor.alipay.com/acce
支付寶支付非同步回撥的一些問題
做了好多次支付寶支付,還是經常掉坑,現在整理下,作為參考1,關於設定公鑰 一定要注意,是“支付寶公鑰”,不要填應用公鑰,不然就坑了2、關於回撥的域名地址 乾淨些,不要有引數,如:http://*****.com/notify.php,千萬不要
支付寶回撥驗籤失敗解決辦法
按照支付寶的文件,呼叫rsaCheckV1的方法,他已經把方法封裝的很透徹了,只需要將取到的引數Map(request.getParameterMap())集合放入即可。但是驗籤一直不通過,查了很多資料,說公鑰不對,應該使用支付寶公鑰,不是應用公鑰,修改之後,還是驗籤不通過。
微信小程式支付流程,非同步回撥及訊息模板呼叫(php原始碼)
首先還是老樣子把流程圖給大家發一下
商戶系統和微信支付系統主要互動:
1、小程式內呼叫登入介面,獲取到使用者的openid,api參見公共api【小程式登入API】
2、商戶server呼叫支付統一下單,api參見公共api【統一下單API】
3、商戶server呼叫再次簽
PHP微信APP支付,下單,處理非同步回撥
1.下單
其中陣列轉換xml格式,curl傳送請求,xml格式轉換成陣列可單獨封裝成函式。
public function index() {
$order = [
'appid'=>'12345
PHP微信APP支付,下單,處理非同步回撥——————微信支付這個坑
1.下單
其中陣列轉換xml格式,curl傳送請求,xml格式轉換成陣列可單獨封裝成函式。
public function index() {
$order = [
'appid'=>'123456',
處理微信支付的非同步回撥
/**
* 微信支付非同步回撥(只有非同步回撥對訂單進行處理)
*/
public function wchatUrlBack()
{
$postStr = file_get_contents('php://input');
i
微信掃碼支付功能(2)---使用者掃碼支付成功,微信非同步回撥商戶介面
使用者掃碼支付成功,微信非同步回撥商戶
當用戶掃碼支付成功之後,微信會非同步回撥商戶介面,告知使用者支付成功。好讓商戶進行下一步操作。
一、介面說明
1、流程圖
這裡要做的就是使用者支付成功後,微信非同步通知商戶支付結果,商戶收到通知後告知支付通知接收情況。
2、介面說明
微信公眾號開發中遇到的問題——支付回撥,分享,獲取openId(三)
微信的統一下單介面(https://api.mch.weixin.qq.com/pay/unifiedorder)中,下單時,有這樣一個引數:notify_url,該引數是為接收微信支付非同步通知回撥的地址,通知url必須為直接可訪問的url,不能攜帶引數。之前我做回撥的時
在應用中顯示的圖片很多情況不滿足業務需求,我們需要動態根據圖片的寬高進行縮放或載入中顯示的預設圖片,這是我沒就需要監聽圖片載入完成回撥,來看看微信小程式怎麼實現圖片載入完成回撥。
<swiper-item>
<image src="{{item.image}}" class="slide-image" mode="widthFix" @tap="bannerjump({{item.l
小程式 - 微信支付 & 支付完成回撥
微信支付是小程式一個重要的功能,詳情參考官方文件
文件中必填的引數由後臺人員返回給前端,通常前端攜帶訂單號請求後臺介面,換取這些引數
觸發支付的程式碼如下
wx.requestPayment({
timeStamp: '',
nonceStr: '',
package:
微信小程式 c#後臺支付結果回撥
public partial class NativeNotifyPage : System.Web.UI.Page
{
public static string wxJsApiParam { get; set; } //前段顯示
public string r
python django 微信支付成功回撥url(notify_url)
微信官方文件:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7 首先 這個 notify_url 有倆個要求 1.公網能直接訪問的 2.不能攜帶引數 (比如你的訂單id)
返回的內容微信請求的內容,為
Android利用微信SDK分享到微信教程,回撥分享結果錯誤解決和注意點
在正式開始之前這裡要著囉嗦一下,進來的同學一定要看,在申請應用的時候要填一個簽名,這個簽名是由應用的簽名檔案keystore決定的,那麼你在填這個簽名的時候,一定要把你的應用用正式的keyStore生成apk,安裝到手機,然後用微信提供的獲取應用簽名的apk工具獲取你應用
node egg框架處理微信支付成功回撥xml資料
直接上詳細程式碼首先使用egg框架中介軟體,在app目錄建middleware資料夾,再建立一個js檔案如該js中的程式碼:module.exports = () => {
return async function (ctx, next) {
微信app支付之回撥多次以及不回撥的解決辦法
前面一篇文章我是在做app支付的時候寫的,做app支付完成之後寫的,這篇主要是支付完成之後的坑。
首先,支付完成之後,主要就是回撥,我首先遇到的就是支付完成之後,並沒有收到資訊,然後就是各種網上找問答。後面突然發現,資料庫裡面無緣無故的竟然有了回撥的資訊(這個我是在回撥頁面