1.客戶端代碼得到用戶購買的商品信息,將之傳給自己公司app服務器,參數(shù)包含但不限于以下:
站在用戶的角度思考問題,與客戶深入溝通,找到龍巖網(wǎng)站設(shè)計與龍巖網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋龍巖地區(qū)。
params.put("appid", appID);// 微信appid,選擇性上傳,服務器寫死亦可
params.put("money", money);// 支付金額,單位:分
params.put("name", goodsName);// 商品名稱
params.put("currencytype", "CNY");// 支付幣種,只能填CNY,代表人民幣12341234
備注:以上是參數(shù)字段是我們公司服務器定義,給服務器用以獲取預支付訂單號prePayId用。
備注2:詳細字段請參考:
2.app服務器調(diào)用微信“統(tǒng)一下單”接口,得到prePayId訂單號并返回prePayId給手機客戶端;
3.手機客戶端使用prePayId及商品信息調(diào)起微信客戶端進行支付;
3.1用戶操作:輸入密碼進行支付;返回鍵取消支付;網(wǎng)絡(luò)無連接支付失敗等;
4.微信客戶端回調(diào)支付結(jié)果給咱們的APP客戶端;
5.微信服務器異步通知咱們公司app服務器支付結(jié)果(服務器的工作,與客戶端無關(guān))
這個其實很簡單的,demo文檔寫得很詳細,直接上代碼吧:
/**
* 獲取sign簽名
*
* @return
*/
private String genPayReq() {
// 獲取參數(shù)的值
PayReq request = new PayReq();
request.appId = ConstantsMember.APP_ID;
request.partnerId = ConstantsMember.MCHID;
request.prepayId = mPrepayId;
request.packageValue = "Sign=WXPay";
request.nonceStr = DataUtil.getGuid();
request.timeStamp = DataUtil.getTimeStamp();
// 把參數(shù)的值傳進去SortedMap集合里面
SortedMapObject, Object parameters = new TreeMapObject, Object();
// {appid=wx34df375d7dae8c90, noncestr=3BF34EF2CA4A462DB8D4EA48E785CDC3,
// package=Sign=WXPay, partnerid=1349967601,
// prepayid=wx2016070910354542c7155d4e0846850809, timestamp=1468031760}
parameters.put("appid", request.appId);
parameters.put("noncestr", request.nonceStr);
parameters.put("package", request.packageValue);
parameters.put("partnerid", request.partnerId);
parameters.put("prepayid", request.prepayId);
parameters.put("timestamp", request.timeStamp);
String characterEncoding = "UTF-8";
String mySign = createSign(characterEncoding, parameters);
System.out.println("我的簽名是:" + mySign);
return mySign;
}
/**
* 微信支付簽名算法sign
*
* @param characterEncoding
* @param parameters
* @return
*/
public static String createSign(String characterEncoding,
SortedMapObject, Object parameters) {
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();// 所有參與傳參的參數(shù)按照accsii排序(升序)
Iterator it = es.iterator();
while (it.hasNext()) {
@SuppressWarnings("rawtypes")
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 + "");
}
}
sb.append("key=" + ConstantsMember.KEY); //KEY是商戶秘鑰
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding)
.toUpperCase();
return sign; // D3A5D13E7838E1D453F4F2EA526C4766
// D3A5D13E7838E1D453F4F2EA526C4766
}
前段時間出去玩了一段時間,回公司得知一個驚天消息——微信支付出問題了?。?!這個問題比較奇怪,說是部分機型可以支付成功,部分機型如小米、三星無法調(diào)起支付,返回-1。
眾所周知返回-1的話代表了各種各樣的錯誤(坑),所以只好從頭開始排查,首先排查 WXPayEntryActivity.java 這個文件是否放在了 .wxapi包 下,及 manifest里的注冊是否為.wxapi.WXPayEntryActivity ,確定無誤后檢查后臺返回的參數(shù)是否有誤
至此如果都正確,可以開始著手檢查在后臺里的參數(shù)設(shè)置是否正確
這里需要注意的是應用簽名和應用包名,因為出問題的包不是由我打包的,我懷疑問題在于應用簽名對不上,最后發(fā)現(xiàn)果然如此。打包的同事使用了另一個keystore文件進行打包,導致應用簽名與后臺填寫的不一致,于是重新生成了簽名更新后臺設(shè)置,問題解決。
至于為什么部分機型可以正常支付,而部分機型無法調(diào)起,我參照有些coder遇到的問題“微信支付只能成功調(diào)起一次”
因為成功支付的機型為公司測試機,而不成功的機型是用戶機,猜測因為公司測試機里曾經(jīng)調(diào)試過微信支付,有正確的包名和簽名的緩存,微信在調(diào)起時直接讀取緩存值,驗證正確后直接調(diào)起,而當緩存值出錯時微信才會再次去讀取新的包名和簽名重新驗證,因此出現(xiàn)了部分機型可支付的問題。也因為這個原因, 修改完簽名后再次調(diào)試,第一次返回的還是-1,但再次點擊就可以成功調(diào)起,此后也沒有再返回-1。 個人猜測,如有錯誤歡迎指出討論。
微信支付的坑實在是太多了,還有OC編寫的iOS的IAP也有很多藏起來的坑,一直想把Unity內(nèi)調(diào)用Java集成的微信、支付寶支付,使用OC集成的iOS內(nèi)購詳細過程寫上來,但是一直犯懶。。這段時間一定要寫好,給自己做個記錄,也給大家作為一個參考。
這個我之前也遇到。確實是公鑰出了問題。
在本地生成一份。
在官網(wǎng)獲取一份。
一步步檢查。會解決的。這個問題就是公鑰或是密鑰的問題。
支付寶集成流程
主要的回調(diào)返回類兩個:PayResult與AuthResult
支付接口的調(diào)用:
支付結(jié)果的接收:
Android開發(fā)集成轉(zhuǎn)賬功能,那么需要集成第三方支付平臺,例如支付寶,微信等等。
集成方式:
到官網(wǎng)申請開發(fā)者帳號
登錄開發(fā)者帳號,申請密鑰
下載集成SDK
集成到Android Project中
按SDK說明文檔調(diào)用支持即可