1.最初に、WeChatオープンプラットフォームで開発とアプリケーションを申請します。 WeChatオープンプラットフォームは、アプリの一意の識別アプリを生成します。支払いセキュリティが必要なため、マーチャントアプリケーションのパッケージ名とアプリケーションの署名は、オープンプラットフォームに拘束される必要があり、支払いはそれをセットアップした後にのみ開始できます。
2。appidを登録します(これはプロジェクトアプリケーションに配置できます)
WeChat JARパッケージは、Merchantアプリプロジェクトに導入されています。 APIを呼び出す前に、appidをWeChatに登録する必要があります。コードは次のとおりです。
final iwxapi msgapi = wxapifactory.createwxapi(context、null); //アプリをwechat msgapi.registerapp( "wxd930ea5d5a258f4f");
3. Unified Single APIを呼び出して、前払い注文を生成します。 Prepay_idを取得した後、パラメーターに署名し、それらをアプリに送信して支払いを開始します。
例:
次のコードの注文番号は、バックグラウンドで生成する必要があります
string url = "https://api.mch.weixin.qq.com/pay/unidedorder"; wxprepost post = new wxprepost(); post.appid = "your appid"; post.mch_id = "あなたの商人番号"; post.nonce_str = stringutils.gennoncestr(); //ランダム文字列** 1 post.body = "product name"; post.detail = "製品説明"; post.out_trade_no = out_trade_no; //商人注文番号** 2 post.total_fee = "コモディティ価格"; //ユニットはpost.spbill_create_ip = getlocalipaddress(); // ipアドレス** 3 post.notify_url = "; post.sign = genpackagesign(post); // signature ** 4 list <namevaluepair> firstSignparams = getFirstSignparams(post);文字列xml = toxml(firstsignparams);文字列entity = null; try {entity = new String(xml.getBytes()、 "ISO8859-1"); byte [] buf = util.httppost(url、entity); if(buf!= null){string content = new String(buf); map <string、string> map = decodexml(content); if(map!= null){// signを再び(署名に参加しているフィールドは次のとおりです。AppidPartnerIDPrepayid NonCestr Timestampパッケージ)string appid = ""; string prepayid = "";文字列noncestr = ""; for(map.entry <string、string> entry:map.entryset()){if( "appid" .equals(entry.getKey())){appid = entry.getValue(); } else if( "prepay_id" .equals(entry.getkey())){prepayid = entry.getValue(); } else if( "nonce_str" .equals(entry.getKey())){noncestr = entry.getValue(); }} log.d(tag、 "run::" + appid + "/" + prepayid + "/" + noncestr + "/"); string timestamp = string.valueof(gentimestamp()); // ok secondary signature string secondpackagesign = gensecondpackagesign(getsecondsignparams(appid、prepayid、noncestr、timestamp)を取得します); payreq req = new Payreq(); req.appid = appid; req.partnerid = "merchant number"; req.prepayid = prepayid; req.noncestr = noncestr; req.timestamp =タイムスタンプ; req.packagevalue = "sign = wxpay"; req.sign = secondPackagesign; req.extdata = "app data"; // Optional // System.out.println( "genpackagesign3:"+post.getSign()+"/"+secondPackagesign); //支払い前に、アプリケーションがWeChatに登録されていない場合は、最初にiWXMSG.RegisterAppに電話して、weChat mapi.sendreq(req)にアプリケーションを登録する必要があります。 log.d(tag、 "run:" + appid + "/" + prepayid + "/" + noncestr + "/" +タイムスタンプ + "/" + secondPackagesign); }}} catch(例外e){} public static byte [] httppost(string url、string entity){if(url == null || url.length()== 0){log.e(tag、 "httppost、url is null"); nullを返します。 } httpclient httpclient = getNewhttpClient(); httppost httppost = new httppost(url); try {httppost.setentity(new Stringentity(Entity)); httppost.setheader( "Accept"、 "application/json"); httppost.setheader( "content-type"、 "application/json"); httpresponse resp = httpclient.execute(httppost); if(resp.getStatusline()。getStatusCode()!= httpstatus.sc_ok){log.e( "httpget fail、status code =" + resp.getStatusline()。getStatusCode()); nullを返します。 } return entityutils.tobytearray(resp.getentity()); } catch(Exception e){log.e(tag、 "httppost例外、e =" + e.getmessage()); e.printstacktrace(); nullを返します。 }}//ランダムな文字列public static string gennoncestr()を取得する方法return md5.getMessageDigest(string.valueof(random.nextint(10000))。getBytes()); }
private string toxml(list <namevaluepair> params){stringbuilder sb = new StringBuilder(); sb.append( "<xml>"); for(int i = 0; i <params.size(); i ++){sb.append( "<" + params.get(i).getname() + ">"); sb.append(params.get(i).getvalue()); sb.append( "</" + params.get(i).getname() + ">"); } sb.append( "</xml>"); return sb.tostring(); } public Map <string、string> decodexml(string content){try {map <string、string> xml = new hashmap <>(); xmlpullparser parser = xml.newpullparser(); parser.setInput(new StringReader(content)); int event = parser.getEventType(); while(event!= xmlpullparser.end_document){string nodename = parser.getname(); switch(event){case xmlpullparser.start_document:break; case xmlpullparser.start_tag:if(! "xml" .equals(nodename)){xml.put(nodename、parser.nexttext()); } 壊す;ケースxmlpullparser.end_tag:break; } event = parser.next(); } xmlを返します。 } catch(例外e){} nullを返します。 } @nonnull private list <namevaluepair> getFirstSignparams(wxprepost params){list <namevaluepair> packageparams = new linkedlist <>(); packageParams.add(new BasicNameValuePair( "appid"、 "appid")); packageParams.add(new BasicNameValuePair( "Body"、params.body)); packageParams.add(new BasicNameValuePair( "Detail"、params.detail)); packageParams.add(new BasicNameValuePair( "MCH_ID"、 "merchant number")); packageParams.add(new BasicNameValuePair( "nonce_str"、params.nonce_str)); packageParams.add(new BasicNameValuePair( "notify_url"、params.notify_url)); PackageParams.add(new BasicNameValuePair( "Out_trade_no"、params.out_trade_no)); packageParams.add(new BasicNameValuePair( "spbill_create_ip"、params.spbill_create_ip)); packageParams.add(new BasicNameValuePair( "Total_fee"、params.total_fee + "")); packageParams.add(new BasicNameValuePair( "trade_type"、params.trade_type)); packageParams.add(new BasicNameValuePair( "sign"、params.sign)); PackageParamsを返します。 } public class wxprepost {// public string appidを使用して持ち込む必要があるパラメーター。 // Wechat Open Platformによって承認されたアプリケーションAppIDパブリックストリングMCH_ID; // wechatによって割り当てられたマーチャント番号は、パブリックストリングnonce_strを支払います。 //ランダムな文字列、32桁以下。推奨される乱数生成アルゴリズムパブリックストリングサイン。 //署名、署名生成アルゴリズムのパブリック文字列本文を参照してください。 //製品の説明トランザクションフィールド形式は、さまざまなアプリケーションシナリオに従って次の形式に従っています:アプリ - アプリケーション市場に渡す必要があるアプリ名 - 実際の製品名、Tiantian Aiying Eliminate-ゲーム充電。 public string out_trade_no; // 32文字以内の文字を含めることができるマーチャントシステム内の注文番号。その他の指示については、商人注文番号public int total_feeを参照してください。 //合計注文額は小さなユニットです。詳細については、支払い金額のパブリックストリングspbill_create_ipを参照してください。 //実際のIPパブリック文字列notify_url; // WeChat Paymentの非同期通知を受信するためのコールバックアドレス、通知URLは直接アクセス可能なURLでなければならず、パラメーターを運ぶことができません。 (バックグラウンドで提供)public string trade_type; //支払いタイプ//パブリック文字列device_infoを運ぶ必要がないパラメーター; //ターミナルデバイス番号(ストア番号またはキャッシャーデバイスID)、デフォルトで「Web」を渡してください。 //製品名の詳細パブリック文字列添付。 //クエリAPIおよび支払い通知のように返される追加データ。このフィールドは、主に注文を伝達する商人のカスタムデータに使用されています。 // ISO 4217標準に準拠した3桁の文字コード、デフォルトのrmb:CNY、詳細については他の値リストについて通貨タイプを参照// public string time_start; // 20091225091010に示すように、注文生成時間はyyyymmddhhmmssです。20091225091010に示すように。 //有効期限を注文すると、2009年12月27日の20091227091010の9:10に示されているように、フォーマットはyyyymmddhhmmssです。その他の詳細については、時間ルールを参照してください。注:最小有効期限間隔は5分を超える必要があります。 public string goods_tag; //製品タグ、バウチャー、または割引割引のパラメーター。詳細については、バウチャーまたは割引割引を参照してください。 // public string limit_pay; // no_credit--クレジットカードを使用してパブリック文字列getAppid()を支払うことができないことを指定します{return appid; } public void setAppid(string appid){this.appid = appid; } public string getmch_id(){return mch_id; } public void setmch_id(string mch_id){this.mch_id = mch_id; } public string getNonce_str(){return nonce_str; } public void setnonce_str(string nonce_str){this.nonce_str = nonce_str; } public string getsign(){return sign; } public void setSign(string sign){this.sign = sign; } public string getBody(){return body; } public void setbody(string body){this.body = body; } public string getout_trade_no(){return out_trade_no; } public void setout_trade_no(string out_trade_no){this.out_trade_no = out_trade_no; } public int gettotal_fee(){return total_fee; } public void settotal_fee(int total_fee){this.total_fee = total_fee; } public string getspbill_create_ip(){return spbill_create_ip; } public void setspbill_create_ip(string spbill_create_ip){this.spbill_create_ip = spbill_create_ip; } public string getNotify_url(){return notify_url; } public void setnotify_url(string notify_url){this.notify_url = notify_url; } public String getTrade_Type(){return trade_type; } public void setTrade_type(String trade_type){this.trade_type = trade_type; } public String getDevice_Info(){return device_info; } public void setDevice_info(String device_info){this.device_info = device_info; } public string getDetail(){return detail; } public void setDetail(string detail){this.detail = detail; } public string getAttach(){return attach; } public void setattach(string attach){this.attach = attach; } public string getFee_Type(){return fee_type; } public void setFee_type(String fee_type){this.fee_type = fee_type; } public string gettime_start(){return time_start; } public void setime_start(string time_start){this.time_start = time_start; } public string gettime_expire(){return time_expire; } public void setime_expire(string time_expire){this.time_expire = time_expire; } public string getGoods_tag(){return goods_tag; } public void setGoods_tag(string goods_tag){this.goods_tag = goods_tag; } public string getlimit_pay(){return limit_pay; } public void setlimit_pay(string limit_pay){this.limit_pay = limit_pay; }}ここに記載されているパラメーターは、モバイル端末自体によって取得できます。もちろん、セキュリティ上の理由でバックグラウンドを提供することが最善です。
支払いが完了した後、WeChatはWXPayEntryactivityを呼び戻します。ここでは詳しく説明しません。 WECHATドキュメントは、WXPayentryactivityのOnResp()で返されたWeChat支払いの結果を明確に述べています(注:この結果は、製品を正常に購入するかどうかの結果ではありません。台湾海峡にWeChatコールバックを使用して、支払い結果を伝えるために台湾海峡に戻る必要があります)。
if(resp.getType()== contantansapi.command_pay_by_wx){int code = resp.errcode; switch(code){case 0:log.d(tag、 "onpayfinish、errcode =" + "pay success"); // wechatの支払いが成功した後、背景に移動すると、バックグラウンドによって返される支払い結果が基礎となります。 //これは、WeChatの支払いが完了した後のコールバックです。以下はバックグラウンドのリクエストを示し、支払いが成功したかどうかを彼に尋ねます。壊す;ケース-1:toast.makeText(this、 "pay failed 1"、toast.length_short).show(); log.d(tag、 "onpayfinish、errcode =" + "pay failed 1");仕上げる();壊す;ケース-2:toast.maketext(this、 "pay cancel"、toast.length_short).show(); log.d(tag、 "onpayfinish、errcode =" + "pay cancel");仕上げる();壊す; default:// toast.maketext(this、 "pay failed 2"、toast.length_short).show(); log.d(tag、 "onpayfinish、errcode =" + "pay failed 2"); setResult(result_ok);仕上げる();壊す; }}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。