国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ WeChat アプレット WeChatの開発 JsApi を介した Java による WeChat 支払いメソッドの実裝の詳細な説明

JsApi を介した Java による WeChat 支払いメソッドの実裝の詳細な説明

Mar 27, 2017 pm 01:56 PM

この記事では、Java が JsApi メソッドで WeChat 支払いを?qū)g裝する方法について説明しています。コードの內(nèi)容が詳細に説明されており、必要な友人は參照できます。

WeChat 支払いに JsApi を使用するには、まず WeChat から prepay_id を取得する必要があります。支払い完了後、JS API get_brand_wcpay_request:ok の戻り結(jié)果は、ユーザーが支払いを正常に完了した場合にのみ返されます。フロントエンドの対話は複雑であるため、get_brand_wcpay_request:cancel または get_brand_wcpay_request:fail は、ユーザーがエラーに遭遇したとき、または自発的に放棄したときに、詳細な區(qū)別なしに一律に処理できます。
サンプルコードは以下のとおりです:

function?onBridgeReady(){
?WeixinJSBridge.invoke(
?'getBrandWCPayRequest',?{
??"appId"?:?"wx2421b1c4370ec43b",?//公眾號名稱,由商戶傳入?
??"timeStamp":"?1395712654",??//時間戳,自1970年以來的秒數(shù)?
??"nonceStr"?:?"e61463f8efa94090b1f366cccfbbb444",?//隨機串?
??"package"?:?"u802345jgfjsdfgsdg888",?
??"signType"?:?"MD5",??//微信簽名方式:?
??"paySign"?:?"70EA570631E4BB79628FBCA90534C63FF7FADD89"?//微信簽名?
?},
?function(res){?
??if(res.err_msg?==?"get_brand_wcpay_request:ok"?)?{}?//?使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回?ok,但并不保證它絕對可靠。?
?}
?);?
}
if?(typeof?WeixinJSBridge?==?"undefined"){
?if(?document.addEventListener?){
?document.addEventListener('WeixinJSBridgeReady',?onBridgeReady,?false);
?}else?if?(document.attachEvent){
?document.attachEvent('WeixinJSBridgeReady',?onBridgeReady);?
?document.attachEvent('onWeixinJSBridgeReady',?onBridgeReady);
?}
}else{
?onBridgeReady();
}

上記のパラメータパッケージ入力はprepay_idです

以下はjsapiを呼び出すためのパラメータの取得についてです
JSAPIを呼び出すときは、ユーザーのopenidを取得する必要があります(trade_type=JSAPI、openidは必須のパラメーター。)
最初に、要求された オブジェクト:

package?com.unstoppedable.protocol;
import?com.unstoppedable.common.Configure;
import?com.unstoppedable.common.HttpService;
import?com.unstoppedable.common.RandomStringGenerator;
import?com.unstoppedable.common.Signature;
import?java.lang.reflect.Field;
import?java.util.HashMap;
import?java.util.Map;
public?class?UnifiedOrderReqData?{
?private?String?appid;
?private?String?mch_id;
?private?String?device_info;
?private?String?nonce_str;
?private?String?sign;
?private?String?body;
?private?String?detail;
?private?String?attach;
?private?String?out_trade_no;
?private?String?fee_type;
?private?int?total_fee;
?private?String?spbill_create_ip;
?private?String?time_start;
?private?String?time_expire;
?private?String?goods_tag;
?private?String?notify_url;
?private?String?trade_type;
?private?String?product_id;
?private?String?limit_pay;
?private?String?openid;
?private?UnifiedOrderReqData(UnifiedOrderReqDataBuilder?builder)?{
?this.appid?=?builder.appid;
?this.mch_id?=?builder.mch_id;
?this.device_info?=?builder.device_info;
?this.nonce_str?=?RandomStringGenerator.getRandomStringByLength(32);
?this.body?=?builder.body;
?this.detail?=?builder.detail;
?this.attach?=?builder.attach;
?this.out_trade_no?=?builder.out_trade_no;
?this.fee_type?=?builder.fee_type;
?this.total_fee?=?builder.total_fee;
?this.spbill_create_ip?=?builder.spbill_create_ip;
?this.time_start?=?builder.time_start;
?this.time_expire?=?builder.time_expire;
?this.goods_tag?=?builder.goods_tag;
?this.notify_url?=?builder.notify_url;
?this.trade_type?=?builder.trade_type;
?this.product_id?=?builder.product_id;
?this.limit_pay?=?builder.limit_pay;
?this.openid?=?builder.openid;
?this.sign?=?Signature.getSign(toMap());
?}
?public?void?setAppid(String?appid)?{
?this.appid?=?appid;
?}
?public?void?setMch_id(String?mch_id)?{
?this.mch_id?=?mch_id;
?}
?public?void?setDevice_info(String?device_info)?{
?this.device_info?=?device_info;
?}
?public?void?setNonce_str(String?nonce_str)?{
?this.nonce_str?=?nonce_str;
?}
?public?void?setSign(String?sign)?{
?this.sign?=?sign;
?}
?public?void?setBody(String?body)?{
?this.body?=?body;
?}
?public?void?setDetail(String?detail)?{
?this.detail?=?detail;
?}
?public?void?setAttach(String?attach)?{
?this.attach?=?attach;
?}
?public?void?setOut_trade_no(String?out_trade_no)?{
?this.out_trade_no?=?out_trade_no;
?}
?public?void?setFee_type(String?fee_type)?{
?this.fee_type?=?fee_type;
?}
?public?void?setTotal_fee(int?total_fee)?{
?this.total_fee?=?total_fee;
?}
?public?void?setSpbill_create_ip(String?spbill_create_ip)?{
?this.spbill_create_ip?=?spbill_create_ip;
?}
?public?void?setTime_start(String?time_start)?{
?this.time_start?=?time_start;
?}
?public?void?setTime_expire(String?time_expire)?{
?this.time_expire?=?time_expire;
?}
?public?void?setGoods_tag(String?goods_tag)?{
?this.goods_tag?=?goods_tag;
?}
?public?void?setNotify_url(String?notify_url)?{
?this.notify_url?=?notify_url;
?}
?public?void?setTrade_type(String?trade_type)?{
?this.trade_type?=?trade_type;
?}
?public?void?setProduct_id(String?product_id)?{
?this.product_id?=?product_id;
?}
?public?void?setLimit_pay(String?limit_pay)?{
?this.limit_pay?=?limit_pay;
?}
?public?void?setOpenid(String?openid)?{
?this.openid?=?openid;
?}
?public?Map<String, Object>?toMap()?{
?Map<String, Object>?map?=?new?HashMap<String, Object>();
?Field[]?fields?=?this.getClass().getDeclaredFields();
?for?(Field?field?:?fields)?{
??Object?obj;
??try?{
??obj?=?field.get(this);
??if?(obj?!=?null)?{
???map.put(field.getName(),?obj);
??}
??}?catch?(IllegalArgumentException?e)?{
??e.printStackTrace();
??}?catch?(IllegalAccessException?e)?{
??e.printStackTrace();
??}
?}
?return?map;
?}
?public?static?class?UnifiedOrderReqDataBuilder?{
?private?String?appid;
?private?String?mch_id;
?private?String?device_info;
?private?String?body;
?private?String?detail;
?private?String?attach;
?private?String?out_trade_no;
?private?String?fee_type;
?private?int?total_fee;
?private?String?spbill_create_ip;
?private?String?time_start;
?private?String?time_expire;
?private?String?goods_tag;
?private?String?notify_url;
?private?String?trade_type;
?private?String?product_id;
?private?String?limit_pay;
?private?String?openid;
?public?UnifiedOrderReqDataBuilder(String?appid,?String?mch_id,?String?body,?String?out_trade_no,?Integer?total_fee,
??????String?spbill_create_ip,?String?notify_url,?String?trade_type)?{
??if?(appid?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)appid不能為null");
??}
??if?(mch_id?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)mch_id不能為null");
??}
??if?(body?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)body不能為null");
??}
??if?(out_trade_no?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)out_trade_no不能為null");
??}
??if?(total_fee?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)total_fee不能為null");
??}
??if?(spbill_create_ip?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)spbill_create_ip不能為null");
??}
??if?(notify_url?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)notify_url不能為null");
??}
??if?(trade_type?==?null)?{
??throw?new?IllegalArgumentException("傳入?yún)?shù)trade_type不能為null");
??}
??this.appid?=?appid;
??this.mch_id?=?mch_id;
??this.body?=?body;
??this.out_trade_no?=?out_trade_no;
??this.total_fee?=?total_fee;
??this.spbill_create_ip?=?spbill_create_ip;
??this.notify_url?=?notify_url;
??this.trade_type?=?trade_type;
?}
?public?UnifiedOrderReqDataBuilder?setDevice_info(String?device_info)?{
??this.device_info?=?device_info;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setDetail(String?detail)?{
??this.detail?=?detail;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setAttach(String?attach)?{
??this.attach?=?attach;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setFee_type(String?fee_type)?{
??this.fee_type?=?fee_type;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setTime_start(String?time_start)?{
??this.time_start?=?time_start;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setTime_expire(String?time_expire)?{
??this.time_expire?=?time_expire;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setGoods_tag(String?goods_tag)?{
??this.goods_tag?=?goods_tag;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setProduct_id(String?product_id)?{
??this.product_id?=?product_id;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setLimit_pay(String?limit_pay)?{
??this.limit_pay?=?limit_pay;
??return?this;
?}
?public?UnifiedOrderReqDataBuilder?setOpenid(String?openid)?{
??this.openid?=?openid;
??return?this;
?}
?public?UnifiedOrderReqData?build()?{
??if("JSAPI".equals(this.trade_type)?&&?this.openid?==?null)?{
??throw?new?IllegalArgumentException("當傳入trade_type為JSAPI時,openid為必填參數(shù)");
??}
??if("NATIVE".equals(this.trade_type)?&&?this.product_id?==?null)?{
??throw?new?IllegalArgumentException("當傳入trade_type為NATIVE時,product_id為必填參數(shù)");
??}
??return?new?UnifiedOrderReqData(this);
?}
?}
}

を定義します。これは、一部のパラメーターが必須であり、一部はオプションであるためです。さらに、すべてのパラメータが渡されるまで符號を計算できないため、ここではビルダー モードが使用されます。ビルダーモードについて。

ネットワーク送信には httpclient を選択します。

package?com.unstoppedable.common;
import?com.thoughtworks.xstream.XStream;
import?com.thoughtworks.xstream.io.xml.DomDriver;
import?com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import?org.apache.commons.logging.Log;
import?org.apache.commons.logging.LogFactory;
import?org.apache.http.HttpEntity;
import?org.apache.http.HttpResponse;
import?org.apache.http.client.ClientProtocolException;
import?org.apache.http.client.ResponseHandler;
import?org.apache.http.client.config.RequestConfig;
import?org.apache.http.client.methods.HttpGet;
import?org.apache.http.client.methods.HttpPost;
import?org.apache.http.conn.ConnectTimeoutException;
import?org.apache.http.conn.ConnectionPoolTimeoutException;
import?org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import?org.apache.http.conn.ssl.SSLContexts;
import?org.apache.http.entity.StringEntity;
import?org.apache.http.impl.client.CloseableHttpClient;
import?org.apache.http.impl.client.HttpClients;
import?org.apache.http.util.EntityUtils;
import?javax.net.ssl.SSLContext;
import?java.io.File;
import?java.io.FileInputStream;
import?java.io.IOException;
import?java.net.SocketTimeoutException;
import?java.security.KeyStore;
/**
?*?Created?by?hupeng?on?2015/7/28.
?*/
public?class?HttpService?{
?private?static?Log?logger?=?LogFactory.getLog(HttpService.class);
?private?static?CloseableHttpClient?httpClient?=?buildHttpClient();
?//連接超時時間,默認10秒
?private?static?int?socketTimeout?=?5000;
?//傳輸超時時間,默認30秒
?private?static?int?connectTimeout?=?5000;
?private?static?int?requestTimeout?=?5000;
?public?static?CloseableHttpClient?buildHttpClient()?{
?try?{
??KeyStore?keyStore?=?KeyStore.getInstance("PKCS12");
??FileInputStream?instream?=?new?FileInputStream(new?File(Configure.getCertLocalPath()));//加載本地的證書進行https加密傳輸
??try?{
??keyStore.load(instream,?Configure.getCertPassword().toCharArray());//設(shè)置證書密碼
??}?finally?{
??instream.close();
??}
??//?Trust?own?CA?and?all?self-signed?certs
??SSLContext?sslcontext?=?SSLContexts.custom()
???.loadKeyMaterial(keyStore,?Configure.getCertPassword().toCharArray())
???.build();
??//?Allow?TLSv1?protocol?only
??SSLConnectionSocketFactory?sslsf?=?new?SSLConnectionSocketFactory(
???sslcontext,
???new?String[]{"TLSv1"},
???null,
???SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
??RequestConfig?requestConfig?=?RequestConfig.custom()
???.setConnectTimeout(connectTimeout)
???.setConnectionRequestTimeout(requestTimeout)
???.setSocketTimeout(socketTimeout).build();
??httpClient?=?HttpClients.custom()
???.setDefaultRequestConfig(requestConfig)
???.setSSLSocketFactory(sslsf)
???.build();
??return?httpClient;
?}?catch?(Exception?e)?{
??throw?new?RuntimeException("error?create?httpclient......",?e);
?}
?}
?public?static?String?doGet(String?requestUrl)?throws?Exception?{
?HttpGet?httpget?=?new?HttpGet(requestUrl);
?try?{
??logger.debug("Executing?request?"?+?httpget.getRequestLine());
??//?Create?a?custom?response?handler
??ResponseHandler<String>?responseHandler?=?new?ResponseHandler<String>()?{
??@Override
??public?String?handleResponse(
???final?HttpResponse?response)?throws?ClientProtocolException,?IOException?{
???int?status?=?response.getStatusLine().getStatusCode();
???if?(status?>=?200?&&?status?< 300) {
   HttpEntity entity = response.getEntity();
   return entity != null ? EntityUtils.toString(entity) : null;
   } else {
   throw new ClientProtocolException("Unexpected response status: " + status);
   }
  }
  };
  return httpClient.execute(httpget, responseHandler);
 } finally {
  httpget.releaseConnection();
 }
 }
 public static String doPost(String url, Object object2Xml) {
 String result = null;
 HttpPost httpPost = new HttpPost(url);
 //解決XStream對出現(xiàn)雙下劃線的bug
 XStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
 //將要提交給API的數(shù)據(jù)對象轉(zhuǎn)換成XML格式數(shù)據(jù)Post給API
 String postDataXML = xStreamForRequestPostData.toXML(object2Xml);
 logger.info("API,POST過去的數(shù)據(jù)是:");
 logger.info(postDataXML);
 //得指明使用UTF-8編碼,否則到API服務器XML的中文不能被成功識別
 StringEntity postEntity = new StringEntity(postDataXML, "UTF-8");
 httpPost.addHeader("Content-Type", "text/xml");
 httpPost.setEntity(postEntity);
 //設(shè)置請求器的配置
 logger.info("executing request" + httpPost.getRequestLine());
 try {
  HttpResponse response = httpClient.execute(httpPost);
  HttpEntity entity = response.getEntity();
  result = EntityUtils.toString(entity, "UTF-8");
 } catch (ConnectionPoolTimeoutException e) {
  logger.error("http get throw ConnectionPoolTimeoutException(wait time out)", e);
 } catch (ConnectTimeoutException e) {
  logger.error("http get throw ConnectTimeoutException", e);
 } catch (SocketTimeoutException e) {
  logger.error("http get throw SocketTimeoutException", e);
 } catch (Exception e) {
  logger.error("http get throw Exception", e);
 } finally {
  httpPost.abort();
 }
 return result;
 }
}

次に、一般的な入り口があります:

package com.unstoppedable.service;
import com.unstoppedable.common.Configure;
import com.unstoppedable.common.HttpService;
import com.unstoppedable.common.XMLParser;
import com.unstoppedable.protocol.UnifiedOrderReqData;
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.Map;
/**
 * Created by hupeng on 2015/7/28.
 */
public class WxPayApi {
 public static Map<String,Object>?UnifiedOrder(UnifiedOrderReqData?reqData)?throws?IOException,?SAXException,?ParserConfigurationException?{
?String?res?=?HttpService.doPost(Configure.UNIFIED_ORDER_API,?reqData);
?return?XMLParser.getMapFromXML(res);
?}
?public?static?void?main(String[]?args)?throws?Exception?{
?UnifiedOrderReqData?reqData?=?new?UnifiedOrderReqData.UnifiedOrderReqDataBuilder("appid",?"mch_id",?"body",?"out_trade_no",?1,?"spbill_create_ip",?"notify_url",?"JSAPI").setOpenid("openid").build();
?System.out.println(UnifiedOrder(reqData));
?}
}

返される XML は次のとおりです:

<xml>
?<return_code><![CDATA[SUCCESS]]></return_code>
?<return_msg><![CDATA[OK]]></return_msg>
?<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
?<mch_id><![CDATA[10000100]]></mch_id>
?<nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
?<sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
?<result_code><![CDATA[SUCCESS]]></result_code>
?<prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
?<trade_type><![CDATA[JSAPI]]></trade_type>
</xml>

return_code と result_code が両方とも SUCCESS の場合、必要な prepay_id が返されます。 。 。そして、それを jsapi で使用するだけです。 。

以上がJsApi を介した Java による WeChat 支払いメソッドの実裝の詳細な説明の詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當する法的責任を負いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)